Home | History | Annotate | Line # | Download | only in rpcgen
rpc_util.c revision 1.1.1.1
      1      1.1  glass /*
      2      1.1  glass  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      3      1.1  glass  * unrestricted use provided that this legend is included on all tape
      4      1.1  glass  * media and as a part of the software program in whole or part.  Users
      5      1.1  glass  * may copy or modify Sun RPC without charge, but are not authorized
      6      1.1  glass  * to license or distribute it to anyone else except as part of a product or
      7  1.1.1.1     pk  * program developed by the user or with the express written consent of
      8  1.1.1.1     pk  * Sun Microsystems, Inc.
      9  1.1.1.1     pk  *
     10      1.1  glass  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     11      1.1  glass  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     12      1.1  glass  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     13  1.1.1.1     pk  *
     14      1.1  glass  * Sun RPC is provided with no support and without any obligation on the
     15      1.1  glass  * part of Sun Microsystems, Inc. to assist in its use, correction,
     16      1.1  glass  * modification or enhancement.
     17  1.1.1.1     pk  *
     18      1.1  glass  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     19      1.1  glass  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     20      1.1  glass  * OR ANY PART THEREOF.
     21  1.1.1.1     pk  *
     22      1.1  glass  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     23      1.1  glass  * or profits or other special, indirect and consequential damages, even if
     24      1.1  glass  * Sun has been advised of the possibility of such damages.
     25  1.1.1.1     pk  *
     26      1.1  glass  * Sun Microsystems, Inc.
     27      1.1  glass  * 2550 Garcia Avenue
     28      1.1  glass  * Mountain View, California  94043
     29      1.1  glass  */
     30  1.1.1.1     pk 
     31      1.1  glass #ifndef lint
     32  1.1.1.1     pk static char sccsid[] = "@(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI";
     33      1.1  glass #endif
     34      1.1  glass 
     35      1.1  glass /*
     36      1.1  glass  * rpc_util.c, Utility routines for the RPC protocol compiler
     37      1.1  glass  */
     38      1.1  glass #include <stdio.h>
     39  1.1.1.1     pk #include <ctype.h>
     40      1.1  glass #include "rpc_scan.h"
     41      1.1  glass #include "rpc_parse.h"
     42      1.1  glass #include "rpc_util.h"
     43      1.1  glass 
     44  1.1.1.1     pk #define ARGEXT "argument"
     45  1.1.1.1     pk 
     46      1.1  glass char curline[MAXLINESIZE];	/* current read line */
     47  1.1.1.1     pk char *where = curline;		/* current point in line */
     48  1.1.1.1     pk int linenum = 0;		/* current line number */
     49      1.1  glass 
     50  1.1.1.1     pk char *infilename;		/* input filename */
     51      1.1  glass 
     52  1.1.1.1     pk #define NFILES 7
     53  1.1.1.1     pk char *outfiles[NFILES];		/* output file names */
     54      1.1  glass int nfiles;
     55      1.1  glass 
     56  1.1.1.1     pk FILE *fout;			/* file pointer of current output */
     57  1.1.1.1     pk FILE *fin;			/* file pointer of current input */
     58      1.1  glass 
     59  1.1.1.1     pk list *defined;			/* list of defined things */
     60      1.1  glass 
     61      1.1  glass /*
     62      1.1  glass  * Reinitialize the world
     63      1.1  glass  */
     64      1.1  glass reinitialize()
     65      1.1  glass {
     66  1.1.1.1     pk 	memset(curline, 0, MAXLINESIZE);
     67      1.1  glass 	where = curline;
     68      1.1  glass 	linenum = 0;
     69      1.1  glass 	defined = NULL;
     70      1.1  glass }
     71      1.1  glass 
     72      1.1  glass /*
     73      1.1  glass  * string equality
     74      1.1  glass  */
     75      1.1  glass streq(a, b)
     76      1.1  glass 	char *a;
     77      1.1  glass 	char *b;
     78      1.1  glass {
     79      1.1  glass 	return (strcmp(a, b) == 0);
     80      1.1  glass }
     81      1.1  glass 
     82      1.1  glass /*
     83      1.1  glass  * find a value in a list
     84      1.1  glass  */
     85  1.1.1.1     pk definition *
     86      1.1  glass findval(lst, val, cmp)
     87      1.1  glass 	list *lst;
     88      1.1  glass 	char *val;
     89      1.1  glass 	int (*cmp) ();
     90      1.1  glass 
     91      1.1  glass {
     92  1.1.1.1     pk 
     93      1.1  glass 	for (; lst != NULL; lst = lst->next) {
     94      1.1  glass 		if ((*cmp) (lst->val, val)) {
     95      1.1  glass 			return (lst->val);
     96      1.1  glass 		}
     97      1.1  glass 	}
     98      1.1  glass 	return (NULL);
     99      1.1  glass }
    100      1.1  glass 
    101      1.1  glass /*
    102      1.1  glass  * store a value in a list
    103      1.1  glass  */
    104      1.1  glass void
    105      1.1  glass storeval(lstp, val)
    106      1.1  glass 	list **lstp;
    107  1.1.1.1     pk 	definition *val;
    108      1.1  glass {
    109      1.1  glass 	list **l;
    110      1.1  glass 	list *lst;
    111      1.1  glass 
    112  1.1.1.1     pk 
    113      1.1  glass 	for (l = lstp; *l != NULL; l = (list **) & (*l)->next);
    114      1.1  glass 	lst = ALLOC(list);
    115      1.1  glass 	lst->val = val;
    116      1.1  glass 	lst->next = NULL;
    117      1.1  glass 	*l = lst;
    118      1.1  glass }
    119      1.1  glass 
    120      1.1  glass static
    121      1.1  glass findit(def, type)
    122      1.1  glass 	definition *def;
    123      1.1  glass 	char *type;
    124      1.1  glass {
    125      1.1  glass 	return (streq(def->def_name, type));
    126      1.1  glass }
    127      1.1  glass 
    128      1.1  glass static char *
    129      1.1  glass fixit(type, orig)
    130      1.1  glass 	char *type;
    131      1.1  glass 	char *orig;
    132      1.1  glass {
    133      1.1  glass 	definition *def;
    134      1.1  glass 
    135      1.1  glass 	def = (definition *) FINDVAL(defined, type, findit);
    136      1.1  glass 	if (def == NULL || def->def_kind != DEF_TYPEDEF) {
    137      1.1  glass 		return (orig);
    138      1.1  glass 	}
    139      1.1  glass 	switch (def->def.ty.rel) {
    140      1.1  glass 	case REL_VECTOR:
    141      1.1  glass 		return (def->def.ty.old_type);
    142      1.1  glass 	case REL_ALIAS:
    143      1.1  glass 		return (fixit(def->def.ty.old_type, orig));
    144      1.1  glass 	default:
    145      1.1  glass 		return (orig);
    146      1.1  glass 	}
    147      1.1  glass }
    148      1.1  glass 
    149      1.1  glass char *
    150      1.1  glass fixtype(type)
    151      1.1  glass 	char *type;
    152      1.1  glass {
    153      1.1  glass 	return (fixit(type, type));
    154      1.1  glass }
    155      1.1  glass 
    156      1.1  glass char *
    157      1.1  glass stringfix(type)
    158      1.1  glass 	char *type;
    159      1.1  glass {
    160      1.1  glass 	if (streq(type, "string")) {
    161      1.1  glass 		return ("wrapstring");
    162      1.1  glass 	} else {
    163      1.1  glass 		return (type);
    164      1.1  glass 	}
    165      1.1  glass }
    166      1.1  glass 
    167      1.1  glass void
    168      1.1  glass ptype(prefix, type, follow)
    169      1.1  glass 	char *prefix;
    170      1.1  glass 	char *type;
    171      1.1  glass 	int follow;
    172      1.1  glass {
    173      1.1  glass 	if (prefix != NULL) {
    174      1.1  glass 		if (streq(prefix, "enum")) {
    175      1.1  glass 			f_print(fout, "enum ");
    176      1.1  glass 		} else {
    177      1.1  glass 			f_print(fout, "struct ");
    178      1.1  glass 		}
    179      1.1  glass 	}
    180      1.1  glass 	if (streq(type, "bool")) {
    181      1.1  glass 		f_print(fout, "bool_t ");
    182      1.1  glass 	} else if (streq(type, "string")) {
    183      1.1  glass 		f_print(fout, "char *");
    184      1.1  glass 	} else {
    185      1.1  glass 		f_print(fout, "%s ", follow ? fixtype(type) : type);
    186      1.1  glass 	}
    187      1.1  glass }
    188      1.1  glass 
    189      1.1  glass static
    190      1.1  glass typedefed(def, type)
    191      1.1  glass 	definition *def;
    192      1.1  glass 	char *type;
    193      1.1  glass {
    194      1.1  glass 	if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL) {
    195      1.1  glass 		return (0);
    196      1.1  glass 	} else {
    197      1.1  glass 		return (streq(def->def_name, type));
    198      1.1  glass 	}
    199      1.1  glass }
    200      1.1  glass 
    201      1.1  glass isvectordef(type, rel)
    202      1.1  glass 	char *type;
    203      1.1  glass 	relation rel;
    204      1.1  glass {
    205      1.1  glass 	definition *def;
    206      1.1  glass 
    207      1.1  glass 	for (;;) {
    208      1.1  glass 		switch (rel) {
    209      1.1  glass 		case REL_VECTOR:
    210      1.1  glass 			return (!streq(type, "string"));
    211      1.1  glass 		case REL_ARRAY:
    212      1.1  glass 			return (0);
    213      1.1  glass 		case REL_POINTER:
    214      1.1  glass 			return (0);
    215      1.1  glass 		case REL_ALIAS:
    216      1.1  glass 			def = (definition *) FINDVAL(defined, type, typedefed);
    217      1.1  glass 			if (def == NULL) {
    218      1.1  glass 				return (0);
    219      1.1  glass 			}
    220      1.1  glass 			type = def->def.ty.old_type;
    221      1.1  glass 			rel = def->def.ty.rel;
    222      1.1  glass 		}
    223      1.1  glass 	}
    224      1.1  glass }
    225      1.1  glass 
    226  1.1.1.1     pk char *
    227      1.1  glass locase(str)
    228      1.1  glass 	char *str;
    229      1.1  glass {
    230      1.1  glass 	char c;
    231      1.1  glass 	static char buf[100];
    232      1.1  glass 	char *p = buf;
    233      1.1  glass 
    234      1.1  glass 	while (c = *str++) {
    235      1.1  glass 		*p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c;
    236      1.1  glass 	}
    237      1.1  glass 	*p = 0;
    238      1.1  glass 	return (buf);
    239      1.1  glass }
    240      1.1  glass 
    241  1.1.1.1     pk void
    242  1.1.1.1     pk pvname_svc(pname, vnum)
    243  1.1.1.1     pk 	char *pname;
    244  1.1.1.1     pk 	char *vnum;
    245  1.1.1.1     pk {
    246  1.1.1.1     pk 	f_print(fout, "%s_%s_svc", locase(pname), vnum);
    247  1.1.1.1     pk }
    248      1.1  glass 
    249      1.1  glass void
    250      1.1  glass pvname(pname, vnum)
    251      1.1  glass 	char *pname;
    252      1.1  glass 	char *vnum;
    253      1.1  glass {
    254      1.1  glass 	f_print(fout, "%s_%s", locase(pname), vnum);
    255      1.1  glass }
    256      1.1  glass 
    257      1.1  glass /*
    258      1.1  glass  * print a useful (?) error message, and then die
    259      1.1  glass  */
    260      1.1  glass void
    261      1.1  glass error(msg)
    262      1.1  glass 	char *msg;
    263      1.1  glass {
    264      1.1  glass 	printwhere();
    265      1.1  glass 	f_print(stderr, "%s, line %d: ", infilename, linenum);
    266      1.1  glass 	f_print(stderr, "%s\n", msg);
    267      1.1  glass 	crash();
    268      1.1  glass }
    269      1.1  glass 
    270      1.1  glass /*
    271      1.1  glass  * Something went wrong, unlink any files that we may have created and then
    272      1.1  glass  * die.
    273      1.1  glass  */
    274      1.1  glass crash()
    275      1.1  glass {
    276      1.1  glass 	int i;
    277      1.1  glass 
    278      1.1  glass 	for (i = 0; i < nfiles; i++) {
    279      1.1  glass 		(void) unlink(outfiles[i]);
    280      1.1  glass 	}
    281      1.1  glass 	exit(1);
    282      1.1  glass }
    283      1.1  glass 
    284      1.1  glass void
    285      1.1  glass record_open(file)
    286      1.1  glass 	char *file;
    287      1.1  glass {
    288      1.1  glass 	if (nfiles < NFILES) {
    289      1.1  glass 		outfiles[nfiles++] = file;
    290      1.1  glass 	} else {
    291      1.1  glass 		f_print(stderr, "too many files!\n");
    292      1.1  glass 		crash();
    293      1.1  glass 	}
    294      1.1  glass }
    295      1.1  glass 
    296      1.1  glass static char expectbuf[100];
    297      1.1  glass static char *toktostr();
    298      1.1  glass 
    299      1.1  glass /*
    300      1.1  glass  * error, token encountered was not the expected one
    301      1.1  glass  */
    302      1.1  glass void
    303      1.1  glass expected1(exp1)
    304      1.1  glass 	tok_kind exp1;
    305      1.1  glass {
    306      1.1  glass 	s_print(expectbuf, "expected '%s'",
    307      1.1  glass 		toktostr(exp1));
    308      1.1  glass 	error(expectbuf);
    309      1.1  glass }
    310      1.1  glass 
    311      1.1  glass /*
    312      1.1  glass  * error, token encountered was not one of two expected ones
    313      1.1  glass  */
    314      1.1  glass void
    315      1.1  glass expected2(exp1, exp2)
    316      1.1  glass 	tok_kind exp1, exp2;
    317      1.1  glass {
    318      1.1  glass 	s_print(expectbuf, "expected '%s' or '%s'",
    319      1.1  glass 		toktostr(exp1),
    320      1.1  glass 		toktostr(exp2));
    321      1.1  glass 	error(expectbuf);
    322      1.1  glass }
    323      1.1  glass 
    324      1.1  glass /*
    325      1.1  glass  * error, token encountered was not one of 3 expected ones
    326      1.1  glass  */
    327      1.1  glass void
    328      1.1  glass expected3(exp1, exp2, exp3)
    329      1.1  glass 	tok_kind exp1, exp2, exp3;
    330      1.1  glass {
    331      1.1  glass 	s_print(expectbuf, "expected '%s', '%s' or '%s'",
    332      1.1  glass 		toktostr(exp1),
    333      1.1  glass 		toktostr(exp2),
    334      1.1  glass 		toktostr(exp3));
    335      1.1  glass 	error(expectbuf);
    336      1.1  glass }
    337      1.1  glass 
    338      1.1  glass void
    339      1.1  glass tabify(f, tab)
    340      1.1  glass 	FILE *f;
    341      1.1  glass 	int tab;
    342      1.1  glass {
    343      1.1  glass 	while (tab--) {
    344      1.1  glass 		(void) fputc('\t', f);
    345      1.1  glass 	}
    346      1.1  glass }
    347      1.1  glass 
    348      1.1  glass 
    349      1.1  glass static token tokstrings[] = {
    350      1.1  glass 			     {TOK_IDENT, "identifier"},
    351      1.1  glass 			     {TOK_CONST, "const"},
    352      1.1  glass 			     {TOK_RPAREN, ")"},
    353      1.1  glass 			     {TOK_LPAREN, "("},
    354      1.1  glass 			     {TOK_RBRACE, "}"},
    355      1.1  glass 			     {TOK_LBRACE, "{"},
    356      1.1  glass 			     {TOK_LBRACKET, "["},
    357      1.1  glass 			     {TOK_RBRACKET, "]"},
    358      1.1  glass 			     {TOK_STAR, "*"},
    359      1.1  glass 			     {TOK_COMMA, ","},
    360      1.1  glass 			     {TOK_EQUAL, "="},
    361      1.1  glass 			     {TOK_COLON, ":"},
    362      1.1  glass 			     {TOK_SEMICOLON, ";"},
    363      1.1  glass 			     {TOK_UNION, "union"},
    364      1.1  glass 			     {TOK_STRUCT, "struct"},
    365      1.1  glass 			     {TOK_SWITCH, "switch"},
    366      1.1  glass 			     {TOK_CASE, "case"},
    367      1.1  glass 			     {TOK_DEFAULT, "default"},
    368      1.1  glass 			     {TOK_ENUM, "enum"},
    369      1.1  glass 			     {TOK_TYPEDEF, "typedef"},
    370      1.1  glass 			     {TOK_INT, "int"},
    371      1.1  glass 			     {TOK_SHORT, "short"},
    372      1.1  glass 			     {TOK_LONG, "long"},
    373      1.1  glass 			     {TOK_UNSIGNED, "unsigned"},
    374      1.1  glass 			     {TOK_DOUBLE, "double"},
    375      1.1  glass 			     {TOK_FLOAT, "float"},
    376      1.1  glass 			     {TOK_CHAR, "char"},
    377      1.1  glass 			     {TOK_STRING, "string"},
    378      1.1  glass 			     {TOK_OPAQUE, "opaque"},
    379      1.1  glass 			     {TOK_BOOL, "bool"},
    380      1.1  glass 			     {TOK_VOID, "void"},
    381      1.1  glass 			     {TOK_PROGRAM, "program"},
    382      1.1  glass 			     {TOK_VERSION, "version"},
    383      1.1  glass 			     {TOK_EOF, "??????"}
    384      1.1  glass };
    385      1.1  glass 
    386      1.1  glass static char *
    387      1.1  glass toktostr(kind)
    388      1.1  glass 	tok_kind kind;
    389      1.1  glass {
    390      1.1  glass 	token *sp;
    391      1.1  glass 
    392      1.1  glass 	for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++);
    393      1.1  glass 	return (sp->str);
    394      1.1  glass }
    395      1.1  glass 
    396      1.1  glass static
    397      1.1  glass printbuf()
    398      1.1  glass {
    399      1.1  glass 	char c;
    400      1.1  glass 	int i;
    401      1.1  glass 	int cnt;
    402      1.1  glass 
    403      1.1  glass #	define TABSIZE 4
    404      1.1  glass 
    405      1.1  glass 	for (i = 0; c = curline[i]; i++) {
    406      1.1  glass 		if (c == '\t') {
    407      1.1  glass 			cnt = 8 - (i % TABSIZE);
    408      1.1  glass 			c = ' ';
    409      1.1  glass 		} else {
    410      1.1  glass 			cnt = 1;
    411      1.1  glass 		}
    412      1.1  glass 		while (cnt--) {
    413      1.1  glass 			(void) fputc(c, stderr);
    414      1.1  glass 		}
    415      1.1  glass 	}
    416      1.1  glass }
    417      1.1  glass 
    418      1.1  glass static
    419      1.1  glass printwhere()
    420      1.1  glass {
    421      1.1  glass 	int i;
    422      1.1  glass 	char c;
    423      1.1  glass 	int cnt;
    424      1.1  glass 
    425      1.1  glass 	printbuf();
    426      1.1  glass 	for (i = 0; i < where - curline; i++) {
    427      1.1  glass 		c = curline[i];
    428      1.1  glass 		if (c == '\t') {
    429      1.1  glass 			cnt = 8 - (i % TABSIZE);
    430      1.1  glass 		} else {
    431      1.1  glass 			cnt = 1;
    432      1.1  glass 		}
    433      1.1  glass 		while (cnt--) {
    434      1.1  glass 			(void) fputc('^', stderr);
    435      1.1  glass 		}
    436      1.1  glass 	}
    437      1.1  glass 	(void) fputc('\n', stderr);
    438      1.1  glass }
    439  1.1.1.1     pk 
    440  1.1.1.1     pk char *
    441  1.1.1.1     pk make_argname(pname, vname)
    442  1.1.1.1     pk     char *pname;
    443  1.1.1.1     pk     char *vname;
    444  1.1.1.1     pk {
    445  1.1.1.1     pk 	char *name;
    446  1.1.1.1     pk 
    447  1.1.1.1     pk 	name = malloc(strlen(pname) + strlen(vname) + strlen(ARGEXT) + 3);
    448  1.1.1.1     pk 	if (!name) {
    449  1.1.1.1     pk 		fprintf(stderr, "failed in malloc");
    450  1.1.1.1     pk 		exit(1);
    451  1.1.1.1     pk 	}
    452  1.1.1.1     pk 	sprintf(name, "%s_%s_%s", locase(pname), vname, ARGEXT);
    453  1.1.1.1     pk 	return(name);
    454  1.1.1.1     pk }
    455  1.1.1.1     pk 
    456  1.1.1.1     pk bas_type *typ_list_h;
    457  1.1.1.1     pk bas_type *typ_list_t;
    458  1.1.1.1     pk 
    459  1.1.1.1     pk add_type(len,type)
    460  1.1.1.1     pk int len;
    461  1.1.1.1     pk char *type;
    462  1.1.1.1     pk {
    463  1.1.1.1     pk   bas_type *ptr;
    464  1.1.1.1     pk 
    465  1.1.1.1     pk 
    466  1.1.1.1     pk   if((ptr = (bas_type *) malloc(sizeof(bas_type)))== (bas_type *)NULL)
    467  1.1.1.1     pk      {
    468  1.1.1.1     pk 	fprintf(stderr, "failed in malloc");
    469  1.1.1.1     pk 	exit(1);
    470  1.1.1.1     pk 	}
    471  1.1.1.1     pk 
    472  1.1.1.1     pk   ptr->name=type;
    473  1.1.1.1     pk   ptr->length=len;
    474  1.1.1.1     pk   ptr->next=NULL;
    475  1.1.1.1     pk   if(typ_list_t == NULL)
    476  1.1.1.1     pk     {
    477  1.1.1.1     pk 
    478  1.1.1.1     pk       typ_list_t=ptr;
    479  1.1.1.1     pk       typ_list_h=ptr;
    480  1.1.1.1     pk     }
    481  1.1.1.1     pk   else
    482  1.1.1.1     pk     {
    483  1.1.1.1     pk 
    484  1.1.1.1     pk     typ_list_t->next=ptr;
    485  1.1.1.1     pk     typ_list_t=ptr;
    486  1.1.1.1     pk     }
    487  1.1.1.1     pk 
    488  1.1.1.1     pk }
    489  1.1.1.1     pk 
    490  1.1.1.1     pk 
    491  1.1.1.1     pk bas_type *find_type(type)
    492  1.1.1.1     pk char *type;
    493  1.1.1.1     pk {
    494  1.1.1.1     pk   bas_type * ptr;
    495  1.1.1.1     pk 
    496  1.1.1.1     pk   ptr=typ_list_h;
    497  1.1.1.1     pk 
    498  1.1.1.1     pk 
    499  1.1.1.1     pk   while(ptr != NULL)
    500  1.1.1.1     pk     {
    501  1.1.1.1     pk     if(strcmp(ptr->name,type) == 0)
    502  1.1.1.1     pk            return(ptr);
    503  1.1.1.1     pk     else
    504  1.1.1.1     pk       ptr=ptr->next;
    505  1.1.1.1     pk     };
    506  1.1.1.1     pk return(NULL);
    507  1.1.1.1     pk }
    508  1.1.1.1     pk 
    509