rpc_hout.c revision 99979
1179337Syongari/* $FreeBSD: head/usr.bin/rpcgen/rpc_hout.c 99979 2002-07-14 17:54:00Z alfred $ */ 2179337Syongari/* 3179337Syongari * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 4179337Syongari * unrestricted use provided that this legend is included on all tape 5179337Syongari * media and as a part of the software program in whole or part. Users 6179337Syongari * may copy or modify Sun RPC without charge, but are not authorized 7179337Syongari * to license or distribute it to anyone else except as part of a product or 8179337Syongari * program developed by the user. 9179337Syongari * 10179337Syongari * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 11179337Syongari * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 12179337Syongari * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 13179337Syongari * 14179337Syongari * Sun RPC is provided with no support and without any obligation on the 15179337Syongari * part of Sun Microsystems, Inc. to assist in its use, correction, 16179337Syongari * modification or enhancement. 17179337Syongari * 18179337Syongari * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 19179337Syongari * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 20179337Syongari * OR ANY PART THEREOF. 21179337Syongari * 22179337Syongari * In no event will Sun Microsystems, Inc. be liable for any lost revenue 23179337Syongari * or profits or other special, indirect and consequential damages, even if 24179337Syongari * Sun has been advised of the possibility of such damages. 25179337Syongari * 26179337Syongari * Sun Microsystems, Inc. 27179337Syongari * 2550 Garcia Avenue 28179337Syongari * Mountain View, California 94043 29179337Syongari */ 30179337Syongari 31179337Syongari#ident "@(#)rpc_hout.c 1.16 94/04/25 SMI" 32179337Syongari 33179337Syongari#ifndef lint 34179337Syongari#if 0 35179337Syongaristatic char sccsid[] = "@(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI"; 36179337Syongari#endif 37179337Syongari#endif 38179337Syongari 39179337Syongari/* 40179337Syongari * rpc_hout.c, Header file outputter for the RPC protocol compiler 41179337Syongari * Copyright (C) 1987, Sun Microsystems, Inc. 42182888Syongari */ 43182888Syongari#include <stdio.h> 44179337Syongari#include <ctype.h> 45179337Syongari#include "rpc_parse.h" 46179337Syongari#include "rpc_util.h" 47179337Syongari 48179337Syongarivoid storexdrfuncdecl( char *, int ); 49182888Syongaristatic void pconstdef( definition * ); 50179337Syongaristatic void pstructdef( definition * ); 51179337Syongaristatic void puniondef( definition * ); 52179337Syongaristatic void pprogramdef( definition * ); 53179337Syongaristatic void pstructdef( definition * ); 54179337Syongaristatic void penumdef( definition * ); 55179337Syongaristatic void ptypedef( definition * ); 56179337Syongaristatic void pdefine( char *, char * ); 57179337Syongaristatic int undefined2( char *, char * ); 58179337Syongaristatic void parglist( proc_list *, char * ); 59179337Syongaristatic void pprocdef( proc_list *, version_list *, char *, int, int ); 60179337Syongarivoid pdeclaration( char *, declaration *, int, char * ); 61179337Syongari 62179337Syongaristatic char RESULT[] = "clnt_res"; 63179337Syongari 64179337Syongari 65179337Syongari/* 66179337Syongari * Print the C-version of an xdr definition 67179337Syongari */ 68179337Syongarivoid 69179337Syongariprint_datadef(def) 70179337Syongari definition *def; 71179337Syongari{ 72179337Syongari 73179337Syongari if (def->def_kind == DEF_PROGRAM) /* handle data only */ 74179337Syongari return; 75179337Syongari 76179337Syongari if (def->def_kind != DEF_CONST) { 77179337Syongari f_print(fout, "\n"); 78179337Syongari } 79179337Syongari switch (def->def_kind) { 80179337Syongari case DEF_STRUCT: 81179337Syongari pstructdef(def); 82179337Syongari break; 83179337Syongari case DEF_UNION: 84179337Syongari puniondef(def); 85179337Syongari break; 86179337Syongari case DEF_ENUM: 87179337Syongari penumdef(def); 88179337Syongari break; 89179337Syongari case DEF_TYPEDEF: 90179337Syongari ptypedef(def); 91179337Syongari break; 92179337Syongari case DEF_PROGRAM: 93179337Syongari pprogramdef(def); 94179337Syongari break; 95179337Syongari case DEF_CONST: 96179337Syongari pconstdef(def); 97179337Syongari break; 98179337Syongari } 99179337Syongari if (def->def_kind != DEF_PROGRAM && def->def_kind != DEF_CONST) { 100179337Syongari storexdrfuncdecl(def->def_name, 101179337Syongari def->def_kind != DEF_TYPEDEF || 102179337Syongari !isvectordef(def->def.ty.old_type, 103179337Syongari def->def.ty.rel)); 104179337Syongari } 105179337Syongari} 106179337Syongari 107179337Syongari 108179337Syongarivoid 109179337Syongariprint_funcdef(def) 110179337Syongari definition *def; 111179337Syongari{ 112179337Syongari switch (def->def_kind) { 113179337Syongari case DEF_PROGRAM: 114179337Syongari f_print(fout, "\n"); 115179337Syongari pprogramdef(def); 116179337Syongari break; 117179337Syongari default: 118179337Syongari break; 119179337Syongari } 120179337Syongari} 121179337Syongari 122179337Syongari/* store away enough information to allow the XDR functions to be spat 123179337Syongari out at the end of the file */ 124179337Syongari 125179337Syongarivoid 126179337Syongaristorexdrfuncdecl(name, pointerp) 127179337Syongarichar *name; 128179337Syongariint pointerp; 129179337Syongari{ 130179337Syongari xdrfunc * xdrptr; 131179337Syongari 132179337Syongari xdrptr = (xdrfunc *) malloc(sizeof (struct xdrfunc)); 133179337Syongari 134179337Syongari xdrptr->name = name; 135179337Syongari xdrptr->pointerp = pointerp; 136179337Syongari xdrptr->next = NULL; 137179337Syongari 138179337Syongari if (xdrfunc_tail == NULL){ 139179337Syongari xdrfunc_head = xdrptr; 140179337Syongari xdrfunc_tail = xdrptr; 141179337Syongari } else { 142179337Syongari xdrfunc_tail->next = xdrptr; 143179337Syongari xdrfunc_tail = xdrptr; 144179337Syongari } 145179337Syongari 146179337Syongari 147179337Syongari} 148179337Syongari 149179337Syongarivoid 150179337Syongariprint_xdr_func_def(name, pointerp, i) 151179337Syongarichar* name; 152179337Syongariint pointerp; 153179337Syongariint i; 154179337Syongari{ 155179337Syongari if (i == 2) { 156179337Syongari f_print(fout, "extern bool_t xdr_%s();\n", name); 157179337Syongari return; 158179337Syongari } 159179337Syongari else 160179337Syongari f_print(fout, "extern bool_t xdr_%s(XDR *, %s%s);\n", name, 161179337Syongari name, pointerp ? "*" : ""); 162179337Syongari 163179337Syongari 164179337Syongari} 165179337Syongari 166179337Syongari 167179337Syongaristatic void 168179337Syongaripconstdef(def) 169179337Syongari definition *def; 170179337Syongari{ 171179337Syongari pdefine(def->def_name, def->def.co); 172179337Syongari} 173179337Syongari 174179337Syongari/* print out the definitions for the arguments of functions in the 175179337Syongari header file 176179337Syongari*/ 177179337Syongaristatic void 178179337Syongaripargdef(def) 179179337Syongari definition *def; 180179337Syongari{ 181179337Syongari decl_list *l; 182179337Syongari version_list *vers; 183179337Syongari char *name; 184179337Syongari proc_list *plist; 185179337Syongari 186179337Syongari 187179337Syongari for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) { 188179337Syongari for (plist = vers->procs; plist != NULL; 189179337Syongari plist = plist->next) { 190179337Syongari 191179337Syongari if (!newstyle || plist->arg_num < 2) { 192179337Syongari continue; /* old style or single args */ 193179337Syongari } 194179337Syongari name = plist->args.argname; 195179337Syongari f_print(fout, "struct %s {\n", name); 196179337Syongari for (l = plist->args.decls; 197179337Syongari l != NULL; l = l->next) { 198179337Syongari pdeclaration(name, &l->decl, 1, 199179337Syongari ";\n"); 200179337Syongari } 201179337Syongari f_print(fout, "};\n"); 202179337Syongari f_print(fout, "typedef struct %s %s;\n", 203179337Syongari name, name); 204179337Syongari storexdrfuncdecl(name, 1); 205179337Syongari f_print(fout, "\n"); 206179337Syongari } 207179337Syongari } 208179337Syongari} 209179337Syongari 210179337Syongari 211179337Syongaristatic void 212179337Syongaripstructdef(def) 213179337Syongari definition *def; 214179337Syongari{ 215179337Syongari decl_list *l; 216179337Syongari char *name = def->def_name; 217179337Syongari 218179337Syongari f_print(fout, "struct %s {\n", name); 219179337Syongari for (l = def->def.st.decls; l != NULL; l = l->next) { 220179337Syongari pdeclaration(name, &l->decl, 1, ";\n"); 221179337Syongari } 222179337Syongari f_print(fout, "};\n"); 223179337Syongari f_print(fout, "typedef struct %s %s;\n", name, name); 224179337Syongari} 225179337Syongari 226179337Syongaristatic void 227179337Syongaripuniondef(def) 228179337Syongari definition *def; 229179337Syongari{ 230179337Syongari case_list *l; 231179337Syongari char *name = def->def_name; 232179337Syongari declaration *decl; 233179337Syongari 234179337Syongari f_print(fout, "struct %s {\n", name); 235179337Syongari decl = &def->def.un.enum_decl; 236179337Syongari if (streq(decl->type, "bool")) { 237179337Syongari f_print(fout, "\tbool_t %s;\n", decl->name); 238179337Syongari } else { 239179337Syongari f_print(fout, "\t%s %s;\n", decl->type, decl->name); 240179337Syongari } 241179337Syongari f_print(fout, "\tunion {\n"); 242179337Syongari for (l = def->def.un.cases; l != NULL; l = l->next) { 243179337Syongari if (l->contflag == 0) 244179337Syongari pdeclaration(name, &l->case_decl, 2, ";\n"); 245179337Syongari } 246179337Syongari decl = def->def.un.default_decl; 247179337Syongari if (decl && !streq(decl->type, "void")) { 248179337Syongari pdeclaration(name, decl, 2, ";\n"); 249179337Syongari } 250179337Syongari f_print(fout, "\t} %s_u;\n", name); 251179337Syongari f_print(fout, "};\n"); 252179337Syongari f_print(fout, "typedef struct %s %s;\n", name, name); 253179337Syongari} 254179337Syongari 255179337Syongaristatic void 256179337Syongaripdefine(name, num) 257179337Syongari char *name; 258179337Syongari char *num; 259179337Syongari{ 260179337Syongari f_print(fout, "#define\t%s %s\n", name, num); 261179337Syongari} 262179337Syongari 263179337Syongaristatic void 264179337Syongaripuldefine(name, num) 265179337Syongari char *name; 266179337Syongari char *num; 267179337Syongari{ 268179337Syongari f_print(fout, "#define\t%s ((unsigned long)(%s))\n", name, num); 269179337Syongari} 270179337Syongari 271179337Syongaristatic int 272179337Syongaridefine_printed(stop, start) 273179337Syongari proc_list *stop; 274179337Syongari version_list *start; 275179337Syongari{ 276179337Syongari version_list *vers; 277179337Syongari proc_list *proc; 278179337Syongari 279179337Syongari for (vers = start; vers != NULL; vers = vers->next) { 280179337Syongari for (proc = vers->procs; proc != NULL; proc = proc->next) { 281179337Syongari if (proc == stop) { 282179337Syongari return (0); 283179337Syongari } else if (streq(proc->proc_name, stop->proc_name)) { 284179337Syongari return (1); 285179337Syongari } 286179337Syongari } 287179337Syongari } 288179337Syongari abort(); 289179337Syongari /* NOTREACHED */ 290179337Syongari} 291179337Syongari 292179337Syongaristatic void 293179337Syongaripfreeprocdef(char * name, char *vers, int mode) 294179337Syongari{ 295179337Syongari f_print(fout, "extern int "); 296179337Syongari pvname(name, vers); 297179337Syongari if (mode == 1) 298179337Syongari f_print(fout,"_freeresult(SVCXPRT *, xdrproc_t, caddr_t);\n"); 299179337Syongari else 300179337Syongari f_print(fout,"_freeresult();\n"); 301179337Syongari 302179337Syongari 303179337Syongari} 304179337Syongari 305179337Syongaristatic void 306179337Syongaripdispatch(char * name, char *vers, int mode) 307179337Syongari{ 308179337Syongari 309179337Syongari f_print(fout, "void "); 310179337Syongari pvname(name, vers); 311179337Syongari if (mode == 1) 312179337Syongari f_print(fout, 313179337Syongari "(struct svc_req *rqstp, register SVCXPRT *transp);\n"); 314179337Syongari else 315179337Syongari f_print(fout,"();\n"); 316179337Syongari 317179337Syongari} 318179337Syongari 319179337Syongaristatic void 320179337Syongaripprogramdef(def) 321179337Syongari definition *def; 322179337Syongari{ 323179337Syongari version_list *vers; 324179337Syongari proc_list *proc; 325179337Syongari int i; 326179337Syongari char *ext; 327179337Syongari 328179337Syongari pargdef(def); 329179337Syongari 330179337Syongari puldefine(def->def_name, def->def.pr.prog_num); 331179337Syongari for (vers = def->def.pr.versions; vers != NULL; vers = vers->next) { 332179337Syongari if (tblflag) { 333179337Syongari f_print(fout, 334179337Syongari "extern struct rpcgen_table %s_%s_table[];\n", 335179337Syongari locase(def->def_name), vers->vers_num); 336179337Syongari f_print(fout, 337179337Syongari "extern %s_%s_nproc;\n", 338179337Syongari locase(def->def_name), vers->vers_num); 339179337Syongari } 340179337Syongari puldefine(vers->vers_name, vers->vers_num); 341179337Syongari 342179337Syongari /* 343179337Syongari * Print out 2 definitions, one for ANSI-C, another for 344179337Syongari * old K & R C 345179337Syongari */ 346179337Syongari 347179337Syongari if(!Cflag){ 348179337Syongari ext = "extern "; 349179337Syongari f_print(fout, "%s", ext); 350179337Syongari pdispatch(def->def_name, vers->vers_num, 2); 351179337Syongari for (proc = vers->procs; proc != NULL; 352179337Syongari proc = proc->next) { 353179337Syongari if (!define_printed(proc, 354179337Syongari def->def.pr.versions)) { 355179337Syongari puldefine(proc->proc_name, 356179337Syongari proc->proc_num); 357179337Syongari } 358179337Syongari f_print(fout, "%s", ext); 359179337Syongari pprocdef(proc, vers, NULL, 0, 2); 360179337Syongari 361179337Syongari if (mtflag) { 362179337Syongari f_print(fout, "%s", ext); 363179337Syongari pprocdef(proc, vers, NULL, 1, 2); 364179337Syongari } 365179337Syongari } 366179337Syongari pfreeprocdef(def->def_name, vers->vers_num, 2); 367179337Syongari 368179337Syongari } else { 369179337Syongari for (i = 1; i < 3; i++){ 370179337Syongari if (i == 1){ 371179337Syongari f_print(fout, "\n#if defined(__STDC__) || defined(__cplusplus)\n"); 372179337Syongari ext = "extern "; 373179337Syongari }else{ 374179337Syongari f_print(fout, "\n#else /* K&R C */\n"); 375179337Syongari ext = "extern "; 376179337Syongari } 377179337Syongari 378179337Syongari f_print(fout, "%s", ext); 379179337Syongari pdispatch(def->def_name, vers->vers_num, i); 380179337Syongari for (proc = vers->procs; proc != NULL; 381179337Syongari proc = proc->next) { 382179337Syongari if (!define_printed(proc, 383179337Syongari def->def.pr.versions)) { 384179337Syongari puldefine(proc->proc_name, 385179337Syongari proc->proc_num); 386179337Syongari } 387179337Syongari f_print(fout, "%s", ext); 388179337Syongari pprocdef(proc, vers, "CLIENT *", 0, i); 389179337Syongari f_print(fout, "%s", ext); 390179337Syongari pprocdef(proc, vers, "struct svc_req *", 1, i); 391179337Syongari } 392179337Syongari pfreeprocdef(def->def_name, vers->vers_num, i); 393179337Syongari } 394179337Syongari f_print(fout, "#endif /* K&R C */\n"); 395179337Syongari } 396179337Syongari } 397179337Syongari} 398179337Syongari 399179337Syongaristatic void 400179337Syongaripprocdef(proc, vp, addargtype, server_p, mode) 401179337Syongari proc_list *proc; 402179337Syongari version_list *vp; 403179337Syongari char* addargtype; 404179337Syongari int server_p; 405179337Syongari int mode; 406179337Syongari{ 407179337Syongari if (mtflag) {/* Print MT style stubs */ 408179337Syongari if (server_p) 409179337Syongari f_print(fout, "bool_t "); 410179337Syongari else 411179337Syongari f_print(fout, "enum clnt_stat "); 412179337Syongari } else { 413179337Syongari ptype(proc->res_prefix, proc->res_type, 1); 414179337Syongari f_print(fout, "* "); 415179337Syongari } 416179337Syongari if (server_p) 417179337Syongari pvname_svc(proc->proc_name, vp->vers_num); 418179337Syongari else 419179337Syongari pvname(proc->proc_name, vp->vers_num); 420179337Syongari 421179337Syongari /* 422179337Syongari * mode 1 = ANSI-C, mode 2 = K&R C 423179337Syongari */ 424179337Syongari if ( mode == 1) 425179337Syongari parglist(proc, addargtype); 426179337Syongari else 427179337Syongari f_print(fout, "();\n"); 428179337Syongari} 429179337Syongari 430179337Syongari 431179337Syongari 432179337Syongari/* print out argument list of procedure */ 433179337Syongaristatic void 434179337Syongariparglist(proc, addargtype) 435179337Syongari proc_list *proc; 436179337Syongari char* addargtype; 437179337Syongari{ 438179337Syongari decl_list *dl; 439179337Syongari 440179337Syongari f_print(fout, "("); 441179337Syongari if (proc->arg_num < 2 && newstyle && 442179337Syongari streq(proc->args.decls->decl.type, "void")) { 443179337Syongari /* 0 argument in new style: do nothing*/ 444179337Syongari } 445179337Syongari else { 446179337Syongari for (dl = proc->args.decls; dl != NULL; dl = dl->next) { 447179337Syongari ptype(dl->decl.prefix, dl->decl.type, 1); 448179337Syongari if (!newstyle) 449179337Syongari f_print(fout, "*"); 450179337Syongari /* old style passes by reference */ 451179337Syongari f_print(fout, ", "); 452179337Syongari } 453179337Syongari } 454179337Syongari 455179337Syongari if (mtflag) { 456179337Syongari ptype(proc->res_prefix, proc->res_type, 1); 457179337Syongari f_print(fout, "*, "); 458179337Syongari } 459179337Syongari 460179337Syongari f_print(fout, "%s);\n", addargtype); 461179337Syongari 462179337Syongari} 463179337Syongari 464179337Syongaristatic void 465179337Syongaripenumdef(def) 466179337Syongari definition *def; 467179337Syongari{ 468179337Syongari char *name = def->def_name; 469179337Syongari enumval_list *l; 470179337Syongari char *last = NULL; 471179337Syongari int count = 0; 472179337Syongari 473179337Syongari f_print(fout, "enum %s {\n", name); 474179337Syongari for (l = def->def.en.vals; l != NULL; l = l->next) { 475179337Syongari f_print(fout, "\t%s", l->name); 476179337Syongari if (l->assignment) { 477179337Syongari f_print(fout, " = %s", l->assignment); 478179337Syongari last = l->assignment; 479179337Syongari count = 1; 480179337Syongari } else { 481179337Syongari if (last == NULL) { 482179337Syongari f_print(fout, " = %d", count++); 483179337Syongari } else { 484179337Syongari f_print(fout, " = %s + %d", last, count++); 485179337Syongari } 486179337Syongari } 487179337Syongari if (l->next) 488179337Syongari f_print(fout, ",\n"); 489179337Syongari else 490179337Syongari f_print(fout, "\n"); 491179337Syongari } 492179337Syongari f_print(fout, "};\n"); 493179337Syongari f_print(fout, "typedef enum %s %s;\n", name, name); 494179337Syongari} 495179337Syongari 496179337Syongaristatic void 497179337Syongariptypedef(def) 498179337Syongari definition *def; 499179337Syongari{ 500179337Syongari char *name = def->def_name; 501179337Syongari char *old = def->def.ty.old_type; 502179337Syongari char prefix[8]; /* enough to contain "struct ", including NUL */ 503179337Syongari relation rel = def->def.ty.rel; 504179337Syongari 505179337Syongari 506179337Syongari if (!streq(name, old)) { 507179337Syongari if (streq(old, "string")) { 508179337Syongari old = "char"; 509179337Syongari rel = REL_POINTER; 510179337Syongari } else if (streq(old, "opaque")) { 511179337Syongari old = "char"; 512179337Syongari } else if (streq(old, "bool")) { 513179337Syongari old = "bool_t"; 514179337Syongari } 515179337Syongari if (undefined2(old, name) && def->def.ty.old_prefix) { 516179337Syongari s_print(prefix, "%s ", def->def.ty.old_prefix); 517179337Syongari } else { 518179337Syongari prefix[0] = 0; 519179337Syongari } 520179337Syongari f_print(fout, "typedef "); 521179337Syongari switch (rel) { 522179337Syongari case REL_ARRAY: 523179337Syongari f_print(fout, "struct {\n"); 524179337Syongari f_print(fout, "\tu_int %s_len;\n", name); 525179337Syongari f_print(fout, "\t%s%s *%s_val;\n", prefix, old, name); 526179337Syongari f_print(fout, "} %s", name); 527179337Syongari break; 528179337Syongari case REL_POINTER: 529179337Syongari f_print(fout, "%s%s *%s", prefix, old, name); 530179337Syongari break; 531179337Syongari case REL_VECTOR: 532179337Syongari f_print(fout, "%s%s %s[%s]", prefix, old, name, 533179337Syongari def->def.ty.array_max); 534179337Syongari break; 535179337Syongari case REL_ALIAS: 536179337Syongari f_print(fout, "%s%s %s", prefix, old, name); 537179337Syongari break; 538179337Syongari } 539179337Syongari f_print(fout, ";\n"); 540179337Syongari } 541179337Syongari} 542179337Syongari 543179337Syongarivoid 544179337Syongaripdeclaration(name, dec, tab, separator) 545179337Syongari char *name; 546179337Syongari declaration *dec; 547179337Syongari int tab; 548179337Syongari char *separator; 549179337Syongari{ 550179337Syongari char buf[8]; /* enough to hold "struct ", include NUL */ 551179337Syongari char *prefix; 552179337Syongari char *type; 553179337Syongari 554179337Syongari if (streq(dec->type, "void")) { 555179337Syongari return; 556179337Syongari } 557179337Syongari tabify(fout, tab); 558179337Syongari if (streq(dec->type, name) && !dec->prefix) { 559179337Syongari f_print(fout, "struct "); 560179337Syongari } 561179337Syongari if (streq(dec->type, "string")) { 562179337Syongari f_print(fout, "char *%s", dec->name); 563179337Syongari } else { 564179337Syongari prefix = ""; 565179337Syongari if (streq(dec->type, "bool")) { 566179337Syongari type = "bool_t"; 567179337Syongari } else if (streq(dec->type, "opaque")) { 568179337Syongari type = "char"; 569179337Syongari } else { 570179337Syongari if (dec->prefix) { 571179337Syongari s_print(buf, "%s ", dec->prefix); 572179337Syongari prefix = buf; 573179337Syongari } 574179337Syongari type = dec->type; 575179337Syongari } 576179337Syongari switch (dec->rel) { 577179337Syongari case REL_ALIAS: 578179337Syongari f_print(fout, "%s%s %s", prefix, type, dec->name); 579179337Syongari break; 580179337Syongari case REL_VECTOR: 581179337Syongari f_print(fout, "%s%s %s[%s]", prefix, type, dec->name, 582179337Syongari dec->array_max); 583179337Syongari break; 584179337Syongari case REL_POINTER: 585179337Syongari f_print(fout, "%s%s *%s", prefix, type, dec->name); 586179337Syongari break; 587179337Syongari case REL_ARRAY: 588179337Syongari f_print(fout, "struct {\n"); 589179337Syongari tabify(fout, tab); 590179337Syongari f_print(fout, "\tu_int %s_len;\n", dec->name); 591179337Syongari tabify(fout, tab); 592179337Syongari f_print(fout, 593179337Syongari "\t%s%s *%s_val;\n", prefix, type, dec->name); 594179337Syongari tabify(fout, tab); 595179337Syongari f_print(fout, "} %s", dec->name); 596179337Syongari break; 597179337Syongari } 598179337Syongari } 599179337Syongari f_print(fout, separator); 600179337Syongari} 601179337Syongari 602179337Syongaristatic int 603179337Syongariundefined2(type, stop) 604179337Syongari char *type; 605179337Syongari char *stop; 606179337Syongari{ 607179337Syongari list *l; 608179337Syongari definition *def; 609179337Syongari 610179337Syongari for (l = defined; l != NULL; l = l->next) { 611179337Syongari def = (definition *) l->val; 612179337Syongari if (def->def_kind != DEF_PROGRAM) { 613179337Syongari if (streq(def->def_name, stop)) { 614179337Syongari return (1); 615179337Syongari } else if (streq(def->def_name, type)) { 616179337Syongari return (0); 617179337Syongari } 618179337Syongari } 619179337Syongari } 620179337Syongari return (1); 621179337Syongari} 622179337Syongari