14e115012SGarrett Wollman /* @(#)rpc_util.c 2.1 88/08/01 4.0 RPCSRC */ 24e115012SGarrett Wollman /* 34e115012SGarrett Wollman * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 44e115012SGarrett Wollman * unrestricted use provided that this legend is included on all tape 54e115012SGarrett Wollman * media and as a part of the software program in whole or part. Users 64e115012SGarrett Wollman * may copy or modify Sun RPC without charge, but are not authorized 74e115012SGarrett Wollman * to license or distribute it to anyone else except as part of a product or 84e115012SGarrett Wollman * program developed by the user. 94e115012SGarrett Wollman * 104e115012SGarrett Wollman * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 114e115012SGarrett Wollman * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 124e115012SGarrett Wollman * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 134e115012SGarrett Wollman * 144e115012SGarrett Wollman * Sun RPC is provided with no support and without any obligation on the 154e115012SGarrett Wollman * part of Sun Microsystems, Inc. to assist in its use, correction, 164e115012SGarrett Wollman * modification or enhancement. 174e115012SGarrett Wollman * 184e115012SGarrett Wollman * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 194e115012SGarrett Wollman * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 204e115012SGarrett Wollman * OR ANY PART THEREOF. 214e115012SGarrett Wollman * 224e115012SGarrett Wollman * In no event will Sun Microsystems, Inc. be liable for any lost revenue 234e115012SGarrett Wollman * or profits or other special, indirect and consequential damages, even if 244e115012SGarrett Wollman * Sun has been advised of the possibility of such damages. 254e115012SGarrett Wollman * 264e115012SGarrett Wollman * Sun Microsystems, Inc. 274e115012SGarrett Wollman * 2550 Garcia Avenue 284e115012SGarrett Wollman * Mountain View, California 94043 294e115012SGarrett Wollman */ 304e115012SGarrett Wollman #ifndef lint 314e115012SGarrett Wollman /*static char sccsid[] = "from: @(#)rpc_util.c 1.5 87/06/24 (C) 1987 SMI";*/ 324e115012SGarrett Wollman static char rcsid[] = "$Id: rpc_util.c,v 1.1 1993/09/13 23:20:20 jtc Exp $"; 334e115012SGarrett Wollman #endif 344e115012SGarrett Wollman 354e115012SGarrett Wollman /* 364e115012SGarrett Wollman * rpc_util.c, Utility routines for the RPC protocol compiler 374e115012SGarrett Wollman * Copyright (C) 1987, Sun Microsystems, Inc. 384e115012SGarrett Wollman */ 394e115012SGarrett Wollman #include <stdio.h> 404e115012SGarrett Wollman #include "rpc_scan.h" 414e115012SGarrett Wollman #include "rpc_parse.h" 424e115012SGarrett Wollman #include "rpc_util.h" 434e115012SGarrett Wollman 444e115012SGarrett Wollman char curline[MAXLINESIZE]; /* current read line */ 454e115012SGarrett Wollman char *where = curline; /* current point in line */ 464e115012SGarrett Wollman int linenum = 0; /* current line number */ 474e115012SGarrett Wollman 484e115012SGarrett Wollman char *infilename; /* input filename */ 494e115012SGarrett Wollman 504e115012SGarrett Wollman #define NFILES 4 514e115012SGarrett Wollman char *outfiles[NFILES]; /* output file names */ 524e115012SGarrett Wollman int nfiles; 534e115012SGarrett Wollman 544e115012SGarrett Wollman FILE *fout; /* file pointer of current output */ 554e115012SGarrett Wollman FILE *fin; /* file pointer of current input */ 564e115012SGarrett Wollman 574e115012SGarrett Wollman list *defined; /* list of defined things */ 584e115012SGarrett Wollman 594e115012SGarrett Wollman static int printwhere(); 604e115012SGarrett Wollman 614e115012SGarrett Wollman /* 624e115012SGarrett Wollman * Reinitialize the world 634e115012SGarrett Wollman */ 644e115012SGarrett Wollman reinitialize() 654e115012SGarrett Wollman { 664e115012SGarrett Wollman bzero(curline, MAXLINESIZE); 674e115012SGarrett Wollman where = curline; 684e115012SGarrett Wollman linenum = 0; 694e115012SGarrett Wollman defined = NULL; 704e115012SGarrett Wollman } 714e115012SGarrett Wollman 724e115012SGarrett Wollman /* 734e115012SGarrett Wollman * string equality 744e115012SGarrett Wollman */ 754e115012SGarrett Wollman streq(a, b) 764e115012SGarrett Wollman char *a; 774e115012SGarrett Wollman char *b; 784e115012SGarrett Wollman { 794e115012SGarrett Wollman return (strcmp(a, b) == 0); 804e115012SGarrett Wollman } 814e115012SGarrett Wollman 824e115012SGarrett Wollman /* 834e115012SGarrett Wollman * find a value in a list 844e115012SGarrett Wollman */ 854e115012SGarrett Wollman char * 864e115012SGarrett Wollman findval(lst, val, cmp) 874e115012SGarrett Wollman list *lst; 884e115012SGarrett Wollman char *val; 894e115012SGarrett Wollman int (*cmp) (); 904e115012SGarrett Wollman 914e115012SGarrett Wollman { 924e115012SGarrett Wollman for (; lst != NULL; lst = lst->next) { 934e115012SGarrett Wollman if ((*cmp) (lst->val, val)) { 944e115012SGarrett Wollman return (lst->val); 954e115012SGarrett Wollman } 964e115012SGarrett Wollman } 974e115012SGarrett Wollman return (NULL); 984e115012SGarrett Wollman } 994e115012SGarrett Wollman 1004e115012SGarrett Wollman /* 1014e115012SGarrett Wollman * store a value in a list 1024e115012SGarrett Wollman */ 1034e115012SGarrett Wollman void 1044e115012SGarrett Wollman storeval(lstp, val) 1054e115012SGarrett Wollman list **lstp; 1064e115012SGarrett Wollman char *val; 1074e115012SGarrett Wollman { 1084e115012SGarrett Wollman list **l; 1094e115012SGarrett Wollman list *lst; 1104e115012SGarrett Wollman 1114e115012SGarrett Wollman for (l = lstp; *l != NULL; l = (list **) & (*l)->next); 1124e115012SGarrett Wollman lst = ALLOC(list); 1134e115012SGarrett Wollman lst->val = val; 1144e115012SGarrett Wollman lst->next = NULL; 1154e115012SGarrett Wollman *l = lst; 1164e115012SGarrett Wollman } 1174e115012SGarrett Wollman 1184e115012SGarrett Wollman 1194e115012SGarrett Wollman static 1204e115012SGarrett Wollman findit(def, type) 1214e115012SGarrett Wollman definition *def; 1224e115012SGarrett Wollman char *type; 1234e115012SGarrett Wollman { 1244e115012SGarrett Wollman return (streq(def->def_name, type)); 1254e115012SGarrett Wollman } 1264e115012SGarrett Wollman 1274e115012SGarrett Wollman 1284e115012SGarrett Wollman static char * 1294e115012SGarrett Wollman fixit(type, orig) 1304e115012SGarrett Wollman char *type; 1314e115012SGarrett Wollman char *orig; 1324e115012SGarrett Wollman { 1334e115012SGarrett Wollman definition *def; 1344e115012SGarrett Wollman 1354e115012SGarrett Wollman def = (definition *) FINDVAL(defined, type, findit); 1364e115012SGarrett Wollman if (def == NULL || def->def_kind != DEF_TYPEDEF) { 1374e115012SGarrett Wollman return (orig); 1384e115012SGarrett Wollman } 1394e115012SGarrett Wollman switch (def->def.ty.rel) { 1404e115012SGarrett Wollman case REL_VECTOR: 1414e115012SGarrett Wollman return (def->def.ty.old_type); 1424e115012SGarrett Wollman case REL_ALIAS: 1434e115012SGarrett Wollman return (fixit(def->def.ty.old_type, orig)); 1444e115012SGarrett Wollman default: 1454e115012SGarrett Wollman return (orig); 1464e115012SGarrett Wollman } 1474e115012SGarrett Wollman } 1484e115012SGarrett Wollman 1494e115012SGarrett Wollman char * 1504e115012SGarrett Wollman fixtype(type) 1514e115012SGarrett Wollman char *type; 1524e115012SGarrett Wollman { 1534e115012SGarrett Wollman return (fixit(type, type)); 1544e115012SGarrett Wollman } 1554e115012SGarrett Wollman 1564e115012SGarrett Wollman char * 1574e115012SGarrett Wollman stringfix(type) 1584e115012SGarrett Wollman char *type; 1594e115012SGarrett Wollman { 1604e115012SGarrett Wollman if (streq(type, "string")) { 1614e115012SGarrett Wollman return ("wrapstring"); 1624e115012SGarrett Wollman } else { 1634e115012SGarrett Wollman return (type); 1644e115012SGarrett Wollman } 1654e115012SGarrett Wollman } 1664e115012SGarrett Wollman 1674e115012SGarrett Wollman void 1684e115012SGarrett Wollman ptype(prefix, type, follow) 1694e115012SGarrett Wollman char *prefix; 1704e115012SGarrett Wollman char *type; 1714e115012SGarrett Wollman int follow; 1724e115012SGarrett Wollman { 1734e115012SGarrett Wollman if (prefix != NULL) { 1744e115012SGarrett Wollman if (streq(prefix, "enum")) { 1754e115012SGarrett Wollman f_print(fout, "enum "); 1764e115012SGarrett Wollman } else { 1774e115012SGarrett Wollman f_print(fout, "struct "); 1784e115012SGarrett Wollman } 1794e115012SGarrett Wollman } 1804e115012SGarrett Wollman if (streq(type, "bool")) { 1814e115012SGarrett Wollman f_print(fout, "bool_t "); 1824e115012SGarrett Wollman } else if (streq(type, "string")) { 1834e115012SGarrett Wollman f_print(fout, "char *"); 1844e115012SGarrett Wollman } else { 1854e115012SGarrett Wollman f_print(fout, "%s ", follow ? fixtype(type) : type); 1864e115012SGarrett Wollman } 1874e115012SGarrett Wollman } 1884e115012SGarrett Wollman 1894e115012SGarrett Wollman 1904e115012SGarrett Wollman static 1914e115012SGarrett Wollman typedefed(def, type) 1924e115012SGarrett Wollman definition *def; 1934e115012SGarrett Wollman char *type; 1944e115012SGarrett Wollman { 1954e115012SGarrett Wollman if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) { 1964e115012SGarrett Wollman return (0); 1974e115012SGarrett Wollman } else { 1984e115012SGarrett Wollman return (streq(def->def_name, type)); 1994e115012SGarrett Wollman } 2004e115012SGarrett Wollman } 2014e115012SGarrett Wollman 2024e115012SGarrett Wollman isvectordef(type, rel) 2034e115012SGarrett Wollman char *type; 2044e115012SGarrett Wollman relation rel; 2054e115012SGarrett Wollman { 2064e115012SGarrett Wollman definition *def; 2074e115012SGarrett Wollman 2084e115012SGarrett Wollman for (;;) { 2094e115012SGarrett Wollman switch (rel) { 2104e115012SGarrett Wollman case REL_VECTOR: 2114e115012SGarrett Wollman return (!streq(type, "string")); 2124e115012SGarrett Wollman case REL_ARRAY: 2134e115012SGarrett Wollman return (0); 2144e115012SGarrett Wollman case REL_POINTER: 2154e115012SGarrett Wollman return (0); 2164e115012SGarrett Wollman case REL_ALIAS: 2174e115012SGarrett Wollman def = (definition *) FINDVAL(defined, type, typedefed); 2184e115012SGarrett Wollman if (def == NULL) { 2194e115012SGarrett Wollman return (0); 2204e115012SGarrett Wollman } 2214e115012SGarrett Wollman type = def->def.ty.old_type; 2224e115012SGarrett Wollman rel = def->def.ty.rel; 2234e115012SGarrett Wollman } 2244e115012SGarrett Wollman } 2254e115012SGarrett Wollman } 2264e115012SGarrett Wollman 2274e115012SGarrett Wollman 2284e115012SGarrett Wollman static char * 2294e115012SGarrett Wollman locase(str) 2304e115012SGarrett Wollman char *str; 2314e115012SGarrett Wollman { 2324e115012SGarrett Wollman char c; 2334e115012SGarrett Wollman static char buf[100]; 2344e115012SGarrett Wollman char *p = buf; 2354e115012SGarrett Wollman 2364e115012SGarrett Wollman while (c = *str++) { 2374e115012SGarrett Wollman *p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c; 2384e115012SGarrett Wollman } 2394e115012SGarrett Wollman *p = 0; 2404e115012SGarrett Wollman return (buf); 2414e115012SGarrett Wollman } 2424e115012SGarrett Wollman 2434e115012SGarrett Wollman 2444e115012SGarrett Wollman void 2454e115012SGarrett Wollman pvname(pname, vnum) 2464e115012SGarrett Wollman char *pname; 2474e115012SGarrett Wollman char *vnum; 2484e115012SGarrett Wollman { 2494e115012SGarrett Wollman f_print(fout, "%s_%s", locase(pname), vnum); 2504e115012SGarrett Wollman } 2514e115012SGarrett Wollman 2524e115012SGarrett Wollman 2534e115012SGarrett Wollman /* 2544e115012SGarrett Wollman * print a useful (?) error message, and then die 2554e115012SGarrett Wollman */ 2564e115012SGarrett Wollman void 2574e115012SGarrett Wollman error(msg) 2584e115012SGarrett Wollman char *msg; 2594e115012SGarrett Wollman { 2604e115012SGarrett Wollman printwhere(); 2614e115012SGarrett Wollman f_print(stderr, "%s, line %d: ", infilename, linenum); 2624e115012SGarrett Wollman f_print(stderr, "%s\n", msg); 2634e115012SGarrett Wollman crash(); 2644e115012SGarrett Wollman } 2654e115012SGarrett Wollman 2664e115012SGarrett Wollman /* 2674e115012SGarrett Wollman * Something went wrong, unlink any files that we may have created and then 2684e115012SGarrett Wollman * die. 2694e115012SGarrett Wollman */ 2704e115012SGarrett Wollman crash() 2714e115012SGarrett Wollman { 2724e115012SGarrett Wollman int i; 2734e115012SGarrett Wollman 2744e115012SGarrett Wollman for (i = 0; i < nfiles; i++) { 2754e115012SGarrett Wollman (void) unlink(outfiles[i]); 2764e115012SGarrett Wollman } 2774e115012SGarrett Wollman exit(1); 2784e115012SGarrett Wollman } 2794e115012SGarrett Wollman 2804e115012SGarrett Wollman 2814e115012SGarrett Wollman void 2824e115012SGarrett Wollman record_open(file) 2834e115012SGarrett Wollman char *file; 2844e115012SGarrett Wollman { 2854e115012SGarrett Wollman if (nfiles < NFILES) { 2864e115012SGarrett Wollman outfiles[nfiles++] = file; 2874e115012SGarrett Wollman } else { 2884e115012SGarrett Wollman f_print(stderr, "too many files!\n"); 2894e115012SGarrett Wollman crash(); 2904e115012SGarrett Wollman } 2914e115012SGarrett Wollman } 2924e115012SGarrett Wollman 2934e115012SGarrett Wollman static char expectbuf[100]; 2944e115012SGarrett Wollman static char *toktostr(); 2954e115012SGarrett Wollman 2964e115012SGarrett Wollman /* 2974e115012SGarrett Wollman * error, token encountered was not the expected one 2984e115012SGarrett Wollman */ 2994e115012SGarrett Wollman void 3004e115012SGarrett Wollman expected1(exp1) 3014e115012SGarrett Wollman tok_kind exp1; 3024e115012SGarrett Wollman { 3034e115012SGarrett Wollman s_print(expectbuf, "expected '%s'", 3044e115012SGarrett Wollman toktostr(exp1)); 3054e115012SGarrett Wollman error(expectbuf); 3064e115012SGarrett Wollman } 3074e115012SGarrett Wollman 3084e115012SGarrett Wollman /* 3094e115012SGarrett Wollman * error, token encountered was not one of two expected ones 3104e115012SGarrett Wollman */ 3114e115012SGarrett Wollman void 3124e115012SGarrett Wollman expected2(exp1, exp2) 3134e115012SGarrett Wollman tok_kind exp1, exp2; 3144e115012SGarrett Wollman { 3154e115012SGarrett Wollman s_print(expectbuf, "expected '%s' or '%s'", 3164e115012SGarrett Wollman toktostr(exp1), 3174e115012SGarrett Wollman toktostr(exp2)); 3184e115012SGarrett Wollman error(expectbuf); 3194e115012SGarrett Wollman } 3204e115012SGarrett Wollman 3214e115012SGarrett Wollman /* 3224e115012SGarrett Wollman * error, token encountered was not one of 3 expected ones 3234e115012SGarrett Wollman */ 3244e115012SGarrett Wollman void 3254e115012SGarrett Wollman expected3(exp1, exp2, exp3) 3264e115012SGarrett Wollman tok_kind exp1, exp2, exp3; 3274e115012SGarrett Wollman { 3284e115012SGarrett Wollman s_print(expectbuf, "expected '%s', '%s' or '%s'", 3294e115012SGarrett Wollman toktostr(exp1), 3304e115012SGarrett Wollman toktostr(exp2), 3314e115012SGarrett Wollman toktostr(exp3)); 3324e115012SGarrett Wollman error(expectbuf); 3334e115012SGarrett Wollman } 3344e115012SGarrett Wollman 3354e115012SGarrett Wollman void 3364e115012SGarrett Wollman tabify(f, tab) 3374e115012SGarrett Wollman FILE *f; 3384e115012SGarrett Wollman int tab; 3394e115012SGarrett Wollman { 3404e115012SGarrett Wollman while (tab--) { 3414e115012SGarrett Wollman (void) fputc('\t', f); 3424e115012SGarrett Wollman } 3434e115012SGarrett Wollman } 3444e115012SGarrett Wollman 3454e115012SGarrett Wollman 3464e115012SGarrett Wollman 3474e115012SGarrett Wollman static token tokstrings[] = { 3484e115012SGarrett Wollman {TOK_IDENT, "identifier"}, 3494e115012SGarrett Wollman {TOK_CONST, "const"}, 3504e115012SGarrett Wollman {TOK_RPAREN, ")"}, 3514e115012SGarrett Wollman {TOK_LPAREN, "("}, 3524e115012SGarrett Wollman {TOK_RBRACE, "}"}, 3534e115012SGarrett Wollman {TOK_LBRACE, "{"}, 3544e115012SGarrett Wollman {TOK_LBRACKET, "["}, 3554e115012SGarrett Wollman {TOK_RBRACKET, "]"}, 3564e115012SGarrett Wollman {TOK_STAR, "*"}, 3574e115012SGarrett Wollman {TOK_COMMA, ","}, 3584e115012SGarrett Wollman {TOK_EQUAL, "="}, 3594e115012SGarrett Wollman {TOK_COLON, ":"}, 3604e115012SGarrett Wollman {TOK_SEMICOLON, ";"}, 3614e115012SGarrett Wollman {TOK_UNION, "union"}, 3624e115012SGarrett Wollman {TOK_STRUCT, "struct"}, 3634e115012SGarrett Wollman {TOK_SWITCH, "switch"}, 3644e115012SGarrett Wollman {TOK_CASE, "case"}, 3654e115012SGarrett Wollman {TOK_DEFAULT, "default"}, 3664e115012SGarrett Wollman {TOK_ENUM, "enum"}, 3674e115012SGarrett Wollman {TOK_TYPEDEF, "typedef"}, 3684e115012SGarrett Wollman {TOK_INT, "int"}, 3694e115012SGarrett Wollman {TOK_SHORT, "short"}, 3704e115012SGarrett Wollman {TOK_LONG, "long"}, 3714e115012SGarrett Wollman {TOK_UNSIGNED, "unsigned"}, 3724e115012SGarrett Wollman {TOK_DOUBLE, "double"}, 3734e115012SGarrett Wollman {TOK_FLOAT, "float"}, 3744e115012SGarrett Wollman {TOK_CHAR, "char"}, 3754e115012SGarrett Wollman {TOK_STRING, "string"}, 3764e115012SGarrett Wollman {TOK_OPAQUE, "opaque"}, 3774e115012SGarrett Wollman {TOK_BOOL, "bool"}, 3784e115012SGarrett Wollman {TOK_VOID, "void"}, 3794e115012SGarrett Wollman {TOK_PROGRAM, "program"}, 3804e115012SGarrett Wollman {TOK_VERSION, "version"}, 3814e115012SGarrett Wollman {TOK_EOF, "??????"} 3824e115012SGarrett Wollman }; 3834e115012SGarrett Wollman 3844e115012SGarrett Wollman static char * 3854e115012SGarrett Wollman toktostr(kind) 3864e115012SGarrett Wollman tok_kind kind; 3874e115012SGarrett Wollman { 3884e115012SGarrett Wollman token *sp; 3894e115012SGarrett Wollman 3904e115012SGarrett Wollman for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++); 3914e115012SGarrett Wollman return (sp->str); 3924e115012SGarrett Wollman } 3934e115012SGarrett Wollman 3944e115012SGarrett Wollman 3954e115012SGarrett Wollman 3964e115012SGarrett Wollman static 3974e115012SGarrett Wollman printbuf() 3984e115012SGarrett Wollman { 3994e115012SGarrett Wollman char c; 4004e115012SGarrett Wollman int i; 4014e115012SGarrett Wollman int cnt; 4024e115012SGarrett Wollman 4034e115012SGarrett Wollman # define TABSIZE 4 4044e115012SGarrett Wollman 4054e115012SGarrett Wollman for (i = 0; c = curline[i]; i++) { 4064e115012SGarrett Wollman if (c == '\t') { 4074e115012SGarrett Wollman cnt = 8 - (i % TABSIZE); 4084e115012SGarrett Wollman c = ' '; 4094e115012SGarrett Wollman } else { 4104e115012SGarrett Wollman cnt = 1; 4114e115012SGarrett Wollman } 4124e115012SGarrett Wollman while (cnt--) { 4134e115012SGarrett Wollman (void) fputc(c, stderr); 4144e115012SGarrett Wollman } 4154e115012SGarrett Wollman } 4164e115012SGarrett Wollman } 4174e115012SGarrett Wollman 4184e115012SGarrett Wollman 4194e115012SGarrett Wollman static 4204e115012SGarrett Wollman printwhere() 4214e115012SGarrett Wollman { 4224e115012SGarrett Wollman int i; 4234e115012SGarrett Wollman char c; 4244e115012SGarrett Wollman int cnt; 4254e115012SGarrett Wollman 4264e115012SGarrett Wollman printbuf(); 4274e115012SGarrett Wollman for (i = 0; i < where - curline; i++) { 4284e115012SGarrett Wollman c = curline[i]; 4294e115012SGarrett Wollman if (c == '\t') { 4304e115012SGarrett Wollman cnt = 8 - (i % TABSIZE); 4314e115012SGarrett Wollman } else { 4324e115012SGarrett Wollman cnt = 1; 4334e115012SGarrett Wollman } 4344e115012SGarrett Wollman while (cnt--) { 4354e115012SGarrett Wollman (void) fputc('^', stderr); 4364e115012SGarrett Wollman } 4374e115012SGarrett Wollman } 4384e115012SGarrett Wollman (void) fputc('\n', stderr); 4394e115012SGarrett Wollman } 440