xref: /openbsd-src/usr.bin/rpcgen/rpc_util.c (revision cfff592fdcba7224e5205351c52ccbbf732bea06)
1*cfff592fSderaadt /*	$OpenBSD: rpc_util.c,v 1.17 2015/08/20 22:32:41 deraadt Exp $	*/
2df930be7Sderaadt /*	$NetBSD: rpc_util.c,v 1.6 1995/08/29 23:05:57 cgd Exp $	*/
3cb7760d1Smillert 
4df930be7Sderaadt /*
5cb7760d1Smillert  * Copyright (c) 2010, Oracle America, Inc.
6df930be7Sderaadt  *
7cb7760d1Smillert  * Redistribution and use in source and binary forms, with or without
8cb7760d1Smillert  * modification, are permitted provided that the following conditions are
9cb7760d1Smillert  * met:
10df930be7Sderaadt  *
11cb7760d1Smillert  *     * Redistributions of source code must retain the above copyright
12cb7760d1Smillert  *       notice, this list of conditions and the following disclaimer.
13cb7760d1Smillert  *     * Redistributions in binary form must reproduce the above
14cb7760d1Smillert  *       copyright notice, this list of conditions and the following
15cb7760d1Smillert  *       disclaimer in the documentation and/or other materials
16cb7760d1Smillert  *       provided with the distribution.
17cb7760d1Smillert  *     * Neither the name of the "Oracle America, Inc." nor the names of its
18cb7760d1Smillert  *       contributors may be used to endorse or promote products derived
19cb7760d1Smillert  *       from this software without specific prior written permission.
20df930be7Sderaadt  *
21cb7760d1Smillert  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22cb7760d1Smillert  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23cb7760d1Smillert  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24cb7760d1Smillert  *   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25cb7760d1Smillert  *   COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
26cb7760d1Smillert  *   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27cb7760d1Smillert  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
28cb7760d1Smillert  *   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29cb7760d1Smillert  *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30cb7760d1Smillert  *   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31cb7760d1Smillert  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32cb7760d1Smillert  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33df930be7Sderaadt  */
34df930be7Sderaadt 
35df930be7Sderaadt /*
36df930be7Sderaadt  * rpc_util.c, Utility routines for the RPC protocol compiler
37df930be7Sderaadt  */
38df930be7Sderaadt #include <stdio.h>
39df930be7Sderaadt #include <stdlib.h>
40df930be7Sderaadt #include <string.h>
41df930be7Sderaadt #include <ctype.h>
42d15c0992Sderaadt #include <unistd.h>
43df930be7Sderaadt #include "rpc_scan.h"
44df930be7Sderaadt #include "rpc_parse.h"
45df930be7Sderaadt #include "rpc_util.h"
46df930be7Sderaadt 
47df930be7Sderaadt #define ARGEXT "argument"
48df930be7Sderaadt 
49c72b5b24Smillert static void printwhere(void);
50df930be7Sderaadt 
51df930be7Sderaadt char curline[MAXLINESIZE];	/* current read line */
52df930be7Sderaadt char *where = curline;		/* current point in line */
53df930be7Sderaadt int linenum = 0;		/* current line number */
54df930be7Sderaadt 
55df930be7Sderaadt char *infilename;		/* input filename */
56df930be7Sderaadt 
57df930be7Sderaadt #define NFILES 7
58df930be7Sderaadt char *outfiles[NFILES];		/* output file names */
59df930be7Sderaadt int nfiles;
60df930be7Sderaadt 
61df930be7Sderaadt FILE *fout;			/* file pointer of current output */
62df930be7Sderaadt FILE *fin;			/* file pointer of current input */
63df930be7Sderaadt 
64df930be7Sderaadt list *defined;			/* list of defined things */
65df930be7Sderaadt 
66df930be7Sderaadt /*
67df930be7Sderaadt  * Reinitialize the world
68df930be7Sderaadt  */
69d15c0992Sderaadt void
reinitialize()70df930be7Sderaadt reinitialize()
71df930be7Sderaadt {
72df930be7Sderaadt 	memset(curline, 0, MAXLINESIZE);
73df930be7Sderaadt 	where = curline;
74df930be7Sderaadt 	linenum = 0;
75df930be7Sderaadt 	defined = NULL;
76df930be7Sderaadt }
77df930be7Sderaadt 
78df930be7Sderaadt /*
79df930be7Sderaadt  * string equality
80df930be7Sderaadt  */
81d15c0992Sderaadt int
streq(a,b)82df930be7Sderaadt streq(a, b)
83df930be7Sderaadt 	char *a;
84df930be7Sderaadt 	char *b;
85df930be7Sderaadt {
86df930be7Sderaadt 	return (strcmp(a, b) == 0);
87df930be7Sderaadt }
88df930be7Sderaadt 
89df930be7Sderaadt /*
90df930be7Sderaadt  * find a value in a list
91df930be7Sderaadt  */
92df930be7Sderaadt definition *
findval(lst,val,cmp)93df930be7Sderaadt findval(lst, val, cmp)
94df930be7Sderaadt 	list *lst;
95df930be7Sderaadt 	char *val;
9674637cb2Sderaadt 	int (*cmp) (definition *, char *);
97df930be7Sderaadt {
98df930be7Sderaadt 
99df930be7Sderaadt 	for (; lst != NULL; lst = lst->next) {
100df930be7Sderaadt 		if ((*cmp) (lst->val, val)) {
101df930be7Sderaadt 			return (lst->val);
102df930be7Sderaadt 		}
103df930be7Sderaadt 	}
104df930be7Sderaadt 	return (NULL);
105df930be7Sderaadt }
106df930be7Sderaadt 
107df930be7Sderaadt /*
108df930be7Sderaadt  * store a value in a list
109df930be7Sderaadt  */
110df930be7Sderaadt void
storeval(lstp,val)111df930be7Sderaadt storeval(lstp, val)
112df930be7Sderaadt 	list **lstp;
113df930be7Sderaadt 	definition *val;
114df930be7Sderaadt {
115df930be7Sderaadt 	list **l;
116df930be7Sderaadt 	list *lst;
117df930be7Sderaadt 
118d0159584Sderaadt 	for (l = lstp; *l != NULL; l = (list **) & (*l)->next)
119d0159584Sderaadt 		;
120*cfff592fSderaadt 	lst = malloc(sizeof(list));
121d0159584Sderaadt 	if (lst == NULL) {
122d0159584Sderaadt 		fprintf(stderr, "failed in alloc\n");
123d0159584Sderaadt 		exit(1);
124d0159584Sderaadt 	}
125df930be7Sderaadt 	lst->val = val;
126df930be7Sderaadt 	lst->next = NULL;
127df930be7Sderaadt 	*l = lst;
128df930be7Sderaadt }
129df930be7Sderaadt 
130d15c0992Sderaadt static int
findit(definition * def,char * type)13123651264Sderaadt findit(definition *def, char *type)
132df930be7Sderaadt {
133df930be7Sderaadt 	return (streq(def->def_name, type));
134df930be7Sderaadt }
135df930be7Sderaadt 
136df930be7Sderaadt static char *
fixit(char * type,char * orig)13723651264Sderaadt fixit(char *type, char *orig)
138df930be7Sderaadt {
139df930be7Sderaadt 	definition *def;
140df930be7Sderaadt 
141df930be7Sderaadt 	def = (definition *) FINDVAL(defined, type, findit);
142df930be7Sderaadt 	if (def == NULL || def->def_kind != DEF_TYPEDEF) {
143df930be7Sderaadt 		return (orig);
144df930be7Sderaadt 	}
145df930be7Sderaadt 	switch (def->def.ty.rel) {
146df930be7Sderaadt 	case REL_VECTOR:
147df930be7Sderaadt 		return (def->def.ty.old_type);
148df930be7Sderaadt 	case REL_ALIAS:
149df930be7Sderaadt 		return (fixit(def->def.ty.old_type, orig));
150df930be7Sderaadt 	default:
151df930be7Sderaadt 		return (orig);
152df930be7Sderaadt 	}
153df930be7Sderaadt }
154df930be7Sderaadt 
155df930be7Sderaadt char *
fixtype(type)156df930be7Sderaadt fixtype(type)
157df930be7Sderaadt 	char *type;
158df930be7Sderaadt {
159df930be7Sderaadt 	return (fixit(type, type));
160df930be7Sderaadt }
161df930be7Sderaadt 
162df930be7Sderaadt char *
stringfix(type)163df930be7Sderaadt stringfix(type)
164df930be7Sderaadt 	char *type;
165df930be7Sderaadt {
166df930be7Sderaadt 	if (streq(type, "string")) {
167df930be7Sderaadt 		return ("wrapstring");
168df930be7Sderaadt 	} else {
169df930be7Sderaadt 		return (type);
170df930be7Sderaadt 	}
171df930be7Sderaadt }
172df930be7Sderaadt 
173df930be7Sderaadt void
ptype(prefix,type,follow)174df930be7Sderaadt ptype(prefix, type, follow)
175df930be7Sderaadt 	char *prefix;
176df930be7Sderaadt 	char *type;
177df930be7Sderaadt 	int follow;
178df930be7Sderaadt {
179df930be7Sderaadt 	if (prefix != NULL) {
180df930be7Sderaadt 		if (streq(prefix, "enum")) {
1814a61a1b9Sderaadt 			fprintf(fout, "enum ");
182df930be7Sderaadt 		} else {
1834a61a1b9Sderaadt 			fprintf(fout, "struct ");
184df930be7Sderaadt 		}
185df930be7Sderaadt 	}
186df930be7Sderaadt 	if (streq(type, "bool")) {
1874a61a1b9Sderaadt 		fprintf(fout, "bool_t ");
188df930be7Sderaadt 	} else if (streq(type, "string")) {
1894a61a1b9Sderaadt 		fprintf(fout, "char *");
190df930be7Sderaadt 	} else {
1914a61a1b9Sderaadt 		fprintf(fout, "%s ", follow ? fixtype(type) : type);
192df930be7Sderaadt 	}
193df930be7Sderaadt }
194df930be7Sderaadt 
195d15c0992Sderaadt static int
typedefed(definition * def,char * type)19623651264Sderaadt typedefed(definition *def, char *type)
197df930be7Sderaadt {
198d0159584Sderaadt 	if (def->def_kind != DEF_TYPEDEF || def->def.ty.old_prefix != NULL)
199df930be7Sderaadt 		return (0);
200d0159584Sderaadt 	else
201df930be7Sderaadt 		return (streq(def->def_name, type));
202df930be7Sderaadt }
203df930be7Sderaadt 
204d15c0992Sderaadt int
isvectordef(type,rel)205df930be7Sderaadt isvectordef(type, rel)
206df930be7Sderaadt 	char *type;
207df930be7Sderaadt 	relation rel;
208df930be7Sderaadt {
209df930be7Sderaadt 	definition *def;
210df930be7Sderaadt 
211df930be7Sderaadt 	for (;;) {
212df930be7Sderaadt 		switch (rel) {
213df930be7Sderaadt 		case REL_VECTOR:
214df930be7Sderaadt 			return (!streq(type, "string"));
215df930be7Sderaadt 		case REL_ARRAY:
216df930be7Sderaadt 			return (0);
217df930be7Sderaadt 		case REL_POINTER:
218df930be7Sderaadt 			return (0);
219df930be7Sderaadt 		case REL_ALIAS:
220df930be7Sderaadt 			def = (definition *) FINDVAL(defined, type, typedefed);
221d0159584Sderaadt 			if (def == NULL)
222df930be7Sderaadt 				return (0);
223df930be7Sderaadt 			type = def->def.ty.old_type;
224df930be7Sderaadt 			rel = def->def.ty.rel;
225df930be7Sderaadt 		}
226df930be7Sderaadt 	}
227df930be7Sderaadt }
228df930be7Sderaadt 
229df930be7Sderaadt char *
locase(str)230df930be7Sderaadt locase(str)
231df930be7Sderaadt 	char *str;
232df930be7Sderaadt {
233df930be7Sderaadt 	char c;
234df930be7Sderaadt 	static char buf[100];
235df930be7Sderaadt 	char *p = buf;
236df930be7Sderaadt 
237d0159584Sderaadt 	while ((c = *str++))
238df930be7Sderaadt 		*p++ = (c >= 'A' && c <= 'Z') ? (c - 'A' + 'a') : c;
239df930be7Sderaadt 	*p = 0;
240df930be7Sderaadt 	return (buf);
241df930be7Sderaadt }
242df930be7Sderaadt 
243df930be7Sderaadt void
pvname_svc(pname,vnum)244df930be7Sderaadt pvname_svc(pname, vnum)
245df930be7Sderaadt 	char *pname;
246df930be7Sderaadt 	char *vnum;
247df930be7Sderaadt {
2484a61a1b9Sderaadt 	fprintf(fout, "%s_%s_svc", locase(pname), vnum);
249df930be7Sderaadt }
250df930be7Sderaadt 
251df930be7Sderaadt void
pvname(pname,vnum)252df930be7Sderaadt pvname(pname, vnum)
253df930be7Sderaadt 	char *pname;
254df930be7Sderaadt 	char *vnum;
255df930be7Sderaadt {
2564a61a1b9Sderaadt 	fprintf(fout, "%s_%s", locase(pname), vnum);
257df930be7Sderaadt }
258df930be7Sderaadt 
259df930be7Sderaadt /*
260df930be7Sderaadt  * print a useful (?) error message, and then die
261df930be7Sderaadt  */
262df930be7Sderaadt void
error(msg)263df930be7Sderaadt error(msg)
264df930be7Sderaadt 	char *msg;
265df930be7Sderaadt {
266df930be7Sderaadt 	printwhere();
2674a61a1b9Sderaadt 	fprintf(stderr, "%s, line %d: ", infilename, linenum);
2684a61a1b9Sderaadt 	fprintf(stderr, "%s\n", msg);
269df930be7Sderaadt 	crash();
270df930be7Sderaadt }
271df930be7Sderaadt 
272df930be7Sderaadt /*
273df930be7Sderaadt  * Something went wrong, unlink any files that we may have created and then
274df930be7Sderaadt  * die.
275df930be7Sderaadt  */
276d15c0992Sderaadt void
crash()277df930be7Sderaadt crash()
278df930be7Sderaadt {
279df930be7Sderaadt 	int i;
280df930be7Sderaadt 
281df930be7Sderaadt 	for (i = 0; i < nfiles; i++) {
282df930be7Sderaadt 		(void) unlink(outfiles[i]);
283df930be7Sderaadt 	}
284df930be7Sderaadt 	exit(1);
285df930be7Sderaadt }
286df930be7Sderaadt 
287df930be7Sderaadt void
record_open(file)288df930be7Sderaadt record_open(file)
289df930be7Sderaadt 	char *file;
290df930be7Sderaadt {
291df930be7Sderaadt 	if (nfiles < NFILES) {
292df930be7Sderaadt 		outfiles[nfiles++] = file;
293df930be7Sderaadt 	} else {
2944a61a1b9Sderaadt 		fprintf(stderr, "too many files!\n");
295df930be7Sderaadt 		crash();
296df930be7Sderaadt 	}
297df930be7Sderaadt }
298df930be7Sderaadt 
299df930be7Sderaadt static char expectbuf[100];
30023651264Sderaadt static char *toktostr(tok_kind);
301df930be7Sderaadt 
302df930be7Sderaadt /*
303df930be7Sderaadt  * error, token encountered was not the expected one
304df930be7Sderaadt  */
305df930be7Sderaadt void
expected1(exp1)306df930be7Sderaadt expected1(exp1)
307df930be7Sderaadt 	tok_kind exp1;
308df930be7Sderaadt {
3094a61a1b9Sderaadt 	snprintf(expectbuf, sizeof expectbuf, "expected '%s'",
310df930be7Sderaadt 	    toktostr(exp1));
311df930be7Sderaadt 	error(expectbuf);
312df930be7Sderaadt }
313df930be7Sderaadt 
314df930be7Sderaadt /*
315df930be7Sderaadt  * error, token encountered was not one of two expected ones
316df930be7Sderaadt  */
317df930be7Sderaadt void
expected2(exp1,exp2)318df930be7Sderaadt expected2(exp1, exp2)
319df930be7Sderaadt 	tok_kind exp1, exp2;
320df930be7Sderaadt {
3214a61a1b9Sderaadt 	snprintf(expectbuf, sizeof expectbuf, "expected '%s' or '%s'",
322d0159584Sderaadt 	    toktostr(exp1), toktostr(exp2));
323df930be7Sderaadt 	error(expectbuf);
324df930be7Sderaadt }
325df930be7Sderaadt 
326df930be7Sderaadt /*
327df930be7Sderaadt  * error, token encountered was not one of 3 expected ones
328df930be7Sderaadt  */
329df930be7Sderaadt void
expected3(exp1,exp2,exp3)330df930be7Sderaadt expected3(exp1, exp2, exp3)
331df930be7Sderaadt 	tok_kind exp1, exp2, exp3;
332df930be7Sderaadt {
3334a61a1b9Sderaadt 	snprintf(expectbuf, sizeof expectbuf, "expected '%s', '%s' or '%s'",
334d0159584Sderaadt 	    toktostr(exp1), toktostr(exp2), toktostr(exp3));
335df930be7Sderaadt 	error(expectbuf);
336df930be7Sderaadt }
337df930be7Sderaadt 
338df930be7Sderaadt void
tabify(f,tab)339df930be7Sderaadt tabify(f, tab)
340df930be7Sderaadt 	FILE *f;
341df930be7Sderaadt 	int tab;
342df930be7Sderaadt {
343df930be7Sderaadt 	while (tab--) {
344df930be7Sderaadt 		(void) fputc('\t', f);
345df930be7Sderaadt 	}
346df930be7Sderaadt }
347df930be7Sderaadt 
348df930be7Sderaadt static token tokstrings[] = {
349df930be7Sderaadt 	{TOK_IDENT, "identifier"},
350df930be7Sderaadt 	{TOK_CONST, "const"},
351df930be7Sderaadt 	{TOK_RPAREN, ")"},
352df930be7Sderaadt 	{TOK_LPAREN, "("},
353df930be7Sderaadt 	{TOK_RBRACE, "}"},
354df930be7Sderaadt 	{TOK_LBRACE, "{"},
355df930be7Sderaadt 	{TOK_LBRACKET, "["},
356df930be7Sderaadt 	{TOK_RBRACKET, "]"},
357df930be7Sderaadt 	{TOK_STAR, "*"},
358df930be7Sderaadt 	{TOK_COMMA, ","},
359df930be7Sderaadt 	{TOK_EQUAL, "="},
360df930be7Sderaadt 	{TOK_COLON, ":"},
361df930be7Sderaadt 	{TOK_SEMICOLON, ";"},
362df930be7Sderaadt 	{TOK_UNION, "union"},
363df930be7Sderaadt 	{TOK_STRUCT, "struct"},
364df930be7Sderaadt 	{TOK_SWITCH, "switch"},
365df930be7Sderaadt 	{TOK_CASE, "case"},
366df930be7Sderaadt 	{TOK_DEFAULT, "default"},
367df930be7Sderaadt 	{TOK_ENUM, "enum"},
368df930be7Sderaadt 	{TOK_TYPEDEF, "typedef"},
369df930be7Sderaadt 	{TOK_INT, "int"},
370df930be7Sderaadt 	{TOK_SHORT, "short"},
371df930be7Sderaadt 	{TOK_LONG, "long"},
372df930be7Sderaadt 	{TOK_UNSIGNED, "unsigned"},
373df930be7Sderaadt 	{TOK_DOUBLE, "double"},
374df930be7Sderaadt 	{TOK_FLOAT, "float"},
375df930be7Sderaadt 	{TOK_CHAR, "char"},
376df930be7Sderaadt 	{TOK_STRING, "string"},
377df930be7Sderaadt 	{TOK_OPAQUE, "opaque"},
378df930be7Sderaadt 	{TOK_BOOL, "bool"},
379df930be7Sderaadt 	{TOK_VOID, "void"},
380df930be7Sderaadt 	{TOK_PROGRAM, "program"},
381df930be7Sderaadt 	{TOK_VERSION, "version"},
382df930be7Sderaadt 	{TOK_EOF, "??????"}
383df930be7Sderaadt };
384df930be7Sderaadt 
385df930be7Sderaadt static char *
toktostr(tok_kind kind)38623651264Sderaadt toktostr(tok_kind kind)
387df930be7Sderaadt {
388df930be7Sderaadt 	token *sp;
389df930be7Sderaadt 
390d0159584Sderaadt 	for (sp = tokstrings; sp->kind != TOK_EOF && sp->kind != kind; sp++)
391d0159584Sderaadt 		;
392df930be7Sderaadt 	return (sp->str);
393df930be7Sderaadt }
394df930be7Sderaadt 
395d15c0992Sderaadt static void
printbuf(void)39623651264Sderaadt printbuf(void)
397df930be7Sderaadt {
398df930be7Sderaadt 	char c;
399df930be7Sderaadt 	int i;
400df930be7Sderaadt 	int cnt;
401df930be7Sderaadt 
402df930be7Sderaadt #	define TABSIZE 4
403df930be7Sderaadt 
404d15c0992Sderaadt 	for (i = 0; (c = curline[i]); i++) {
405df930be7Sderaadt 		if (c == '\t') {
406df930be7Sderaadt 			cnt = 8 - (i % TABSIZE);
407df930be7Sderaadt 			c = ' ';
408df930be7Sderaadt 		} else {
409df930be7Sderaadt 			cnt = 1;
410df930be7Sderaadt 		}
411df930be7Sderaadt 		while (cnt--) {
412df930be7Sderaadt 			(void) fputc(c, stderr);
413df930be7Sderaadt 		}
414df930be7Sderaadt 	}
415df930be7Sderaadt }
416df930be7Sderaadt 
417df930be7Sderaadt static void
printwhere()418df930be7Sderaadt printwhere()
419df930be7Sderaadt {
420df930be7Sderaadt 	int i;
421df930be7Sderaadt 	char c;
422df930be7Sderaadt 	int cnt;
423df930be7Sderaadt 
424df930be7Sderaadt 	printbuf();
425df930be7Sderaadt 	for (i = 0; i < where - curline; i++) {
426df930be7Sderaadt 		c = curline[i];
427df930be7Sderaadt 		if (c == '\t') {
428df930be7Sderaadt 			cnt = 8 - (i % TABSIZE);
429df930be7Sderaadt 		} else {
430df930be7Sderaadt 			cnt = 1;
431df930be7Sderaadt 		}
432df930be7Sderaadt 		while (cnt--) {
433df930be7Sderaadt 			(void) fputc('^', stderr);
434df930be7Sderaadt 		}
435df930be7Sderaadt 	}
436df930be7Sderaadt 	(void) fputc('\n', stderr);
437df930be7Sderaadt }
438df930be7Sderaadt 
439df930be7Sderaadt char *
make_argname(pname,vname)440df930be7Sderaadt make_argname(pname, vname)
441df930be7Sderaadt 	char *pname;
442df930be7Sderaadt 	char *vname;
443df930be7Sderaadt {
444df930be7Sderaadt 	char *name;
4454a61a1b9Sderaadt 	int len = strlen(pname) + strlen(vname) + strlen(ARGEXT) + 3;
446df930be7Sderaadt 
447*cfff592fSderaadt 	name = malloc(len);
448df930be7Sderaadt 	if (!name) {
449d0159584Sderaadt 		fprintf(stderr, "failed in malloc\n");
450df930be7Sderaadt 		exit(1);
451df930be7Sderaadt 	}
4524a61a1b9Sderaadt 	snprintf(name, len, "%s_%s_%s", locase(pname), vname, ARGEXT);
453df930be7Sderaadt 	return(name);
454df930be7Sderaadt }
455df930be7Sderaadt 
456df930be7Sderaadt bas_type *typ_list_h;
457df930be7Sderaadt bas_type *typ_list_t;
458df930be7Sderaadt 
459df930be7Sderaadt void
add_type(len,type)460df930be7Sderaadt add_type(len, type)
461df930be7Sderaadt 	int len;
462df930be7Sderaadt 	char *type;
463df930be7Sderaadt {
464df930be7Sderaadt 	bas_type *ptr;
465df930be7Sderaadt 
466*cfff592fSderaadt 	if ((ptr = malloc(sizeof(bas_type))) == (bas_type *)NULL) {
467d0159584Sderaadt 		fprintf(stderr, "failed in malloc\n");
468df930be7Sderaadt 		exit(1);
469df930be7Sderaadt 	}
470df930be7Sderaadt 
471df930be7Sderaadt 	ptr->name = type;
472df930be7Sderaadt 	ptr->length = len;
473df930be7Sderaadt 	ptr->next = NULL;
474df930be7Sderaadt 	if (typ_list_t == NULL) {
475df930be7Sderaadt 		typ_list_t = ptr;
476df930be7Sderaadt 		typ_list_h = ptr;
477df930be7Sderaadt 	} else {
478df930be7Sderaadt 		typ_list_t->next = ptr;
479df930be7Sderaadt 		typ_list_t = ptr;
480df930be7Sderaadt 	}
481df930be7Sderaadt }
482df930be7Sderaadt 
483df930be7Sderaadt bas_type *
find_type(type)484df930be7Sderaadt find_type(type)
485df930be7Sderaadt 	char *type;
486df930be7Sderaadt {
487df930be7Sderaadt 	bas_type * ptr;
488df930be7Sderaadt 
489df930be7Sderaadt 	ptr = typ_list_h;
490df930be7Sderaadt 
491df930be7Sderaadt 	while (ptr != NULL) {
492df930be7Sderaadt 		if (strcmp(ptr->name, type) == 0)
493df930be7Sderaadt 			return(ptr);
494df930be7Sderaadt 		else
495df930be7Sderaadt 			ptr = ptr->next;
496df930be7Sderaadt 	}
497df930be7Sderaadt 	return(NULL);
498df930be7Sderaadt }
499df930be7Sderaadt 
500