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