1*2775Sraf /*
2*2775Sraf * CDDL HEADER START
3*2775Sraf *
4*2775Sraf * The contents of this file are subject to the terms of the
5*2775Sraf * Common Development and Distribution License, Version 1.0 only
6*2775Sraf * (the "License"). You may not use this file except in compliance
7*2775Sraf * with the License.
8*2775Sraf *
9*2775Sraf * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*2775Sraf * or http://www.opensolaris.org/os/licensing.
11*2775Sraf * See the License for the specific language governing permissions
12*2775Sraf * and limitations under the License.
13*2775Sraf *
14*2775Sraf * When distributing Covered Code, include this CDDL HEADER in each
15*2775Sraf * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*2775Sraf * If applicable, add the following below this CDDL HEADER, with the
17*2775Sraf * fields enclosed by brackets "[]" replaced with your own identifying
18*2775Sraf * information: Portions Copyright [yyyy] [name of copyright owner]
19*2775Sraf *
20*2775Sraf * CDDL HEADER END
21*2775Sraf */
22*2775Sraf /*
23*2775Sraf * Copyright (c) 1997-1999 by Sun Microsystems, Inc.
24*2775Sraf * All rights reserved.
25*2775Sraf */
26*2775Sraf
27*2775Sraf #pragma ident "%Z%%M% %I% %E% SMI"
28*2775Sraf
29*2775Sraf #include <stdio.h>
30*2775Sraf #include <string.h>
31*2775Sraf #include <limits.h>
32*2775Sraf #include <malloc.h>
33*2775Sraf #include "parser.h"
34*2775Sraf #include "trace.h"
35*2775Sraf #include "util.h"
36*2775Sraf #include "symtab.h"
37*2775Sraf #include "errlog.h"
38*2775Sraf
39*2775Sraf /* Types */
40*2775Sraf enum kind_t { PRIMITIVE = 0, COMPOSITE, VARARG };
41*2775Sraf
42*2775Sraf struct entry_t {
43*2775Sraf char *e_name;
44*2775Sraf int e_valid;
45*2775Sraf int e_line;
46*2775Sraf char *e_file;
47*2775Sraf int e_kind; /* PRIMITIVE, COMPOSITE... */
48*2775Sraf char *e_type; /* where kind == PRIMITIVE */
49*2775Sraf /* base type, ie. char if e_type is char */
50*2775Sraf char *e_basetype;
51*2775Sraf int e_levels; /* levels of indirection */
52*2775Sraf char *e_attribute; /* kind == COMPOSITE or VARARG. */
53*2775Sraf char *e_assertion; /* reserved for kind == VARARG. */
54*2775Sraf char *e_comment; /* reserved for per-element comments. */
55*2775Sraf int e_pre_uses;
56*2775Sraf int e_post_uses;
57*2775Sraf };
58*2775Sraf
59*2775Sraf typedef struct entry_head_t {
60*2775Sraf int used;
61*2775Sraf int n_entries;
62*2775Sraf ENTRY entry[1]; /* Actually entry[n_entries]. */
63*2775Sraf } EHEAD;
64*2775Sraf
65*2775Sraf static struct symtab_t {
66*2775Sraf ENTRY *Function;
67*2775Sraf EHEAD *Args;
68*2775Sraf EHEAD *Varargs;
69*2775Sraf EHEAD *Globals;
70*2775Sraf ENTRY *Errval;
71*2775Sraf
72*2775Sraf /* Includes */
73*2775Sraf table_t *Includes;
74*2775Sraf
75*2775Sraf /* Bindings */
76*2775Sraf ENTRY *Exception;
77*2775Sraf
78*2775Sraf /* Types */
79*2775Sraf table_t *Print_Types;
80*2775Sraf
81*2775Sraf /* Error-message information. */
82*2775Sraf int Line;
83*2775Sraf char Filename[MAXLINE];
84*2775Sraf
85*2775Sraf /* Trace additions */
86*2775Sraf char Prototype[MAXLINE];
87*2775Sraf char Formals[MAXLINE];
88*2775Sraf char Actuals[MAXLINE];
89*2775Sraf char Cast[MAXLINE];
90*2775Sraf int Nonreturn;
91*2775Sraf int Skip;
92*2775Sraf
93*2775Sraf /* Adl additions */
94*2775Sraf /* various assertions, one hopes */
95*2775Sraf } Symtab;
96*2775Sraf
97*2775Sraf /* File Globals. */
98*2775Sraf static EHEAD *create_entry_table(int);
99*2775Sraf static EHEAD *add_entry_table(EHEAD *,
100*2775Sraf char *, int, char *, int, char *, char *, int, char *, int, int);
101*2775Sraf static ENTRY *get_entry_table(EHEAD *, int);
102*2775Sraf static EHEAD *free_entry_table(EHEAD *);
103*2775Sraf static void clear_entries(EHEAD *, int, int);
104*2775Sraf static ENTRY *allocate_entry(ENTRY *, char *, int, char *, int,
105*2775Sraf char *, char *, int, char *, int, int);
106*2775Sraf static ENTRY *set_entry(ENTRY *,
107*2775Sraf char *, int, char *, int, char *, char *, int, char *, int, int);
108*2775Sraf static ENTRY *free_entry(ENTRY *);
109*2775Sraf static void symtab_clear_varargs(void);
110*2775Sraf static void symtab_clear_globals(void);
111*2775Sraf static void symtab_clear_print_types(void);
112*2775Sraf static void symtab_set_nonreturn(int);
113*2775Sraf static table_t *symtab_free_print_types(table_t *);
114*2775Sraf
115*2775Sraf /*
116*2775Sraf * symtab_new_function -- clear counts, variables for a new function.
117*2775Sraf */
118*2775Sraf void
symtab_new_function(const int line,const char * file)119*2775Sraf symtab_new_function(const int line, const char *file)
120*2775Sraf {
121*2775Sraf errlog(BEGIN, "symtab_new_function() {");
122*2775Sraf Symtab.Line = line; /* Set, don't clear. */
123*2775Sraf symtab_set_filename(file);
124*2775Sraf
125*2775Sraf symtab_clear_function();
126*2775Sraf symtab_clear_varargs();
127*2775Sraf symtab_clear_globals();
128*2775Sraf symtab_clear_errval();
129*2775Sraf symtab_clear_exception();
130*2775Sraf symtab_clear_print_types();
131*2775Sraf
132*2775Sraf symtab_set_nonreturn(NO);
133*2775Sraf symtab_set_skip(NO);
134*2775Sraf errlog(END, "}");
135*2775Sraf }
136*2775Sraf
137*2775Sraf
138*2775Sraf /*
139*2775Sraf * symtab_clear_function -- clear function-prototype-derived
140*2775Sraf * values. Called on each prototype line and at beginning
141*2775Sraf * of interface.
142*2775Sraf */
143*2775Sraf void
symtab_clear_function(void)144*2775Sraf symtab_clear_function(void)
145*2775Sraf {
146*2775Sraf
147*2775Sraf errlog(BEGIN, "symtab_clear_function() {");
148*2775Sraf Symtab.Function = free_entry(Symtab.Function);
149*2775Sraf Symtab.Args = free_entry_table(Symtab.Args);
150*2775Sraf Symtab.Prototype[0] = NULL;
151*2775Sraf Symtab.Formals[0] = NULL;
152*2775Sraf Symtab.Actuals[0] = NULL;
153*2775Sraf Symtab.Cast[0] = NULL;
154*2775Sraf errlog(END, "}");
155*2775Sraf }
156*2775Sraf
157*2775Sraf
158*2775Sraf /*
159*2775Sraf * symtab_clear_varargs -- called only at end
160*2775Sraf */
161*2775Sraf static void
symtab_clear_varargs(void)162*2775Sraf symtab_clear_varargs(void)
163*2775Sraf {
164*2775Sraf
165*2775Sraf errlog(BEGIN, "symtab_clear_varargs() {");
166*2775Sraf Symtab.Varargs = free_entry_table(Symtab.Varargs);
167*2775Sraf errlog(END, "}");
168*2775Sraf }
169*2775Sraf
170*2775Sraf /*
171*2775Sraf * symtab_clear_includes -- clear only at end of file (union++)
172*2775Sraf */
173*2775Sraf void
symtab_clear_includes(void)174*2775Sraf symtab_clear_includes(void)
175*2775Sraf {
176*2775Sraf
177*2775Sraf errlog(BEGIN, "symtab_clear_includes() {");
178*2775Sraf Symtab.Includes = free_string_table(Symtab.Includes);
179*2775Sraf errlog(END, "}");
180*2775Sraf }
181*2775Sraf
182*2775Sraf static void
symtab_clear_globals(void)183*2775Sraf symtab_clear_globals(void)
184*2775Sraf {
185*2775Sraf
186*2775Sraf errlog(BEGIN, "symtab_clear_globals() {");
187*2775Sraf Symtab.Globals = free_entry_table(Symtab.Globals);
188*2775Sraf errlog(END, "}");
189*2775Sraf }
190*2775Sraf
191*2775Sraf void
symtab_clear_errval(void)192*2775Sraf symtab_clear_errval(void)
193*2775Sraf {
194*2775Sraf
195*2775Sraf errlog(BEGIN, "symtab_clear_errval() {");
196*2775Sraf Symtab.Errval = free_entry(Symtab.Errval);
197*2775Sraf errlog(END, "}");
198*2775Sraf }
199*2775Sraf
200*2775Sraf void
symtab_clear_exception(void)201*2775Sraf symtab_clear_exception(void)
202*2775Sraf {
203*2775Sraf
204*2775Sraf errlog(BEGIN, "symtab_clear_exception() {");
205*2775Sraf Symtab.Exception = free_entry(Symtab.Exception);
206*2775Sraf errlog(END, "}");
207*2775Sraf }
208*2775Sraf
209*2775Sraf static void
symtab_clear_print_types(void)210*2775Sraf symtab_clear_print_types(void)
211*2775Sraf {
212*2775Sraf
213*2775Sraf errlog(BEGIN, "symtab_clear_print_types() {");
214*2775Sraf Symtab.Print_Types = symtab_free_print_types(Symtab.Print_Types);
215*2775Sraf errlog(END, "}");
216*2775Sraf }
217*2775Sraf
218*2775Sraf
219*2775Sraf /* Generated by m4 -- character string values */
220*2775Sraf
221*2775Sraf void
symtab_set_prototype(char * p)222*2775Sraf symtab_set_prototype(char *p)
223*2775Sraf {
224*2775Sraf
225*2775Sraf errlog(BEGIN, "symtab_set_prototype(void) {");
226*2775Sraf (void) strncpy(Symtab.Prototype, p, sizeof (Symtab.Prototype));
227*2775Sraf Symtab.Prototype[sizeof (Symtab.Prototype)-1] = NULL;
228*2775Sraf errlog(END, "}");
229*2775Sraf }
230*2775Sraf
231*2775Sraf char *
symtab_get_prototype(void)232*2775Sraf symtab_get_prototype(void)
233*2775Sraf {
234*2775Sraf errlog(BEGIN, "symtab_get_prototype() {"); errlog(END, "}");
235*2775Sraf return (Symtab.Prototype);
236*2775Sraf }
237*2775Sraf
238*2775Sraf void
symtab_set_formals(char * p)239*2775Sraf symtab_set_formals(char *p)
240*2775Sraf {
241*2775Sraf errlog(BEGIN, "symtab_set_formals() {");
242*2775Sraf errlog(VERBOSE, "p = %s", p);
243*2775Sraf (void) strncpy(Symtab.Formals, p, sizeof (Symtab.Formals));
244*2775Sraf Symtab.Formals[sizeof (Symtab.Formals)-1] = NULL;
245*2775Sraf errlog(END, "}");
246*2775Sraf }
247*2775Sraf
248*2775Sraf char *
symtab_get_formals(void)249*2775Sraf symtab_get_formals(void)
250*2775Sraf {
251*2775Sraf errlog(BEGIN, "symtab_get_formals() {"); errlog(END, "}");
252*2775Sraf return (Symtab.Formals);
253*2775Sraf }
254*2775Sraf
255*2775Sraf void
symtab_set_actuals(char * p)256*2775Sraf symtab_set_actuals(char *p)
257*2775Sraf {
258*2775Sraf errlog(BEGIN, "symtab_set_actuals() {"); errlog(END, "}");
259*2775Sraf errlog(VERBOSE, "p = %s", p);
260*2775Sraf (void) strncpy(Symtab.Actuals, p, sizeof (Symtab.Actuals));
261*2775Sraf Symtab.Actuals[sizeof (Symtab.Actuals)-1] = NULL;
262*2775Sraf }
263*2775Sraf
264*2775Sraf char *
symtab_get_actuals(void)265*2775Sraf symtab_get_actuals(void)
266*2775Sraf {
267*2775Sraf errlog(BEGIN, "symtab_get_actuals() {"); errlog(END, "}");
268*2775Sraf return (Symtab.Actuals);
269*2775Sraf }
270*2775Sraf
271*2775Sraf void
symtab_set_cast(char * p)272*2775Sraf symtab_set_cast(char *p)
273*2775Sraf {
274*2775Sraf errlog(BEGIN, "symtab_set_cast() {"); errlog(END, "}");
275*2775Sraf (void) strncpy(Symtab.Cast, p, sizeof (Symtab.Cast));
276*2775Sraf Symtab.Cast[sizeof (Symtab.Cast)-1] = NULL;
277*2775Sraf }
278*2775Sraf
279*2775Sraf char *
symtab_get_cast(void)280*2775Sraf symtab_get_cast(void)
281*2775Sraf {
282*2775Sraf errlog(BEGIN, "symtab_get_cast() {"); errlog(END, "}");
283*2775Sraf return (Symtab.Cast);
284*2775Sraf }
285*2775Sraf
286*2775Sraf
287*2775Sraf void
symtab_set_filename(const char * p)288*2775Sraf symtab_set_filename(const char *p)
289*2775Sraf {
290*2775Sraf errlog(BEGIN, "symtab_set_filename() {"); errlog(END, "}");
291*2775Sraf (void) strncpy(Symtab.Filename, p, sizeof (Symtab.Filename));
292*2775Sraf Symtab.Filename[sizeof (Symtab.Filename)-1] = NULL;
293*2775Sraf }
294*2775Sraf
295*2775Sraf char *
symtab_get_filename(void)296*2775Sraf symtab_get_filename(void)
297*2775Sraf {
298*2775Sraf errlog(BEGIN, "symtab_get_filename() {"); errlog(END, "}");
299*2775Sraf return (Symtab.Filename);
300*2775Sraf }
301*2775Sraf
302*2775Sraf
303*2775Sraf /* Generated by m4 -- int values */
304*2775Sraf
305*2775Sraf static void
symtab_set_nonreturn(int val)306*2775Sraf symtab_set_nonreturn(int val)
307*2775Sraf {
308*2775Sraf errlog(BEGIN, "symtab_set_nonreturn() {"); errlog(END, "}");
309*2775Sraf Symtab.Nonreturn = val;
310*2775Sraf }
311*2775Sraf
312*2775Sraf int
symtab_get_nonreturn(void)313*2775Sraf symtab_get_nonreturn(void)
314*2775Sraf {
315*2775Sraf errlog(BEGIN, "symtab_get_nonreturn() {"); errlog(END, "}");
316*2775Sraf return (Symtab.Nonreturn);
317*2775Sraf }
318*2775Sraf
319*2775Sraf void
symtab_set_line(int val)320*2775Sraf symtab_set_line(int val)
321*2775Sraf {
322*2775Sraf errlog(BEGIN, "symtab_set_line() {"); errlog(END, "}");
323*2775Sraf Symtab.Line = val;
324*2775Sraf }
325*2775Sraf
326*2775Sraf int
symtab_get_line(void)327*2775Sraf symtab_get_line(void)
328*2775Sraf {
329*2775Sraf errlog(BEGIN, "symtab_get_line() {"); errlog(END, "}");
330*2775Sraf return (Symtab.Line);
331*2775Sraf }
332*2775Sraf
333*2775Sraf
334*2775Sraf void
symtab_set_skip(int value)335*2775Sraf symtab_set_skip(int value)
336*2775Sraf {
337*2775Sraf errlog(BEGIN, "symtab_set_skip() {"); errlog(END, "}");
338*2775Sraf Symtab.Skip = value;
339*2775Sraf }
340*2775Sraf
341*2775Sraf int
symtab_get_skip(void)342*2775Sraf symtab_get_skip(void)
343*2775Sraf {
344*2775Sraf errlog(BEGIN, "symtab_get_skip() {"); errlog(END, "}");
345*2775Sraf return (Symtab.Skip);
346*2775Sraf }
347*2775Sraf
348*2775Sraf /*
349*2775Sraf * Manually written access functions for ENTRY * variables.
350*2775Sraf */
351*2775Sraf
352*2775Sraf void
symtab_set_function(char * name,int line,char * file,char * type,char * basetype,int levels)353*2775Sraf symtab_set_function(char *name, int line, char *file,
354*2775Sraf char *type, char *basetype, int levels)
355*2775Sraf {
356*2775Sraf
357*2775Sraf errlog(BEGIN, "symtab_set_function() {");
358*2775Sraf Symtab.Function = allocate_entry(Symtab.Function,
359*2775Sraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
360*2775Sraf errlog(END, "}");
361*2775Sraf }
362*2775Sraf
363*2775Sraf ENTRY *
symtab_get_function(void)364*2775Sraf symtab_get_function(void)
365*2775Sraf {
366*2775Sraf errlog(BEGIN, "symtab_get_function() {"); errlog(END, "}");
367*2775Sraf if (Symtab.Function == NULL)
368*2775Sraf return (NULL);
369*2775Sraf else
370*2775Sraf return ((Symtab.Function->e_valid)? Symtab.Function: NULL);
371*2775Sraf }
372*2775Sraf
373*2775Sraf void
symtab_set_exception(char * value,int line,char * file)374*2775Sraf symtab_set_exception(char *value, int line, char *file)
375*2775Sraf {
376*2775Sraf
377*2775Sraf errlog(BEGIN, "symtab_set_exception() {");
378*2775Sraf Symtab.Exception = allocate_entry(Symtab.Exception,
379*2775Sraf value, line, file, COMPOSITE, "", "", 0, "", -1, -1);
380*2775Sraf errlog(END, "}");
381*2775Sraf }
382*2775Sraf
383*2775Sraf ENTRY *
symtab_get_exception(void)384*2775Sraf symtab_get_exception(void)
385*2775Sraf {
386*2775Sraf
387*2775Sraf errlog(BEGIN, "symtab_get_exception() {"); errlog(END, "}");
388*2775Sraf if (Symtab.Exception == NULL)
389*2775Sraf return (NULL);
390*2775Sraf else
391*2775Sraf return ((Symtab.Exception->e_valid)? Symtab.Exception: NULL);
392*2775Sraf }
393*2775Sraf
394*2775Sraf void
symtab_set_errval(char * name,int line,char * file,char * type,char * basetype,int levels)395*2775Sraf symtab_set_errval(char *name, int line, char *file, char *type, char *basetype,
396*2775Sraf int levels)
397*2775Sraf {
398*2775Sraf
399*2775Sraf errlog(BEGIN, "symtab_set_errval() {");
400*2775Sraf Symtab.Errval = allocate_entry(Symtab.Errval,
401*2775Sraf name, line, file, PRIMITIVE, type, basetype, levels,
402*2775Sraf "", -1, -1);
403*2775Sraf errlog(END, "}");
404*2775Sraf }
405*2775Sraf
406*2775Sraf ENTRY *
symtab_get_errval(void)407*2775Sraf symtab_get_errval(void)
408*2775Sraf {
409*2775Sraf
410*2775Sraf errlog(BEGIN, "symtab_get_errval() {"); errlog(END, "}");
411*2775Sraf if (Symtab.Errval == NULL)
412*2775Sraf return (NULL);
413*2775Sraf else
414*2775Sraf return ((Symtab.Errval->e_valid)? Symtab.Errval: NULL);
415*2775Sraf }
416*2775Sraf
417*2775Sraf /*
418*2775Sraf * Manually written access function for tables of ENTRYs
419*2775Sraf */
420*2775Sraf void
symtab_add_args(char * name,int line,char * file,char * type,char * basetype,int levels)421*2775Sraf symtab_add_args(char *name, int line, char *file,
422*2775Sraf char *type, char *basetype, int levels)
423*2775Sraf {
424*2775Sraf
425*2775Sraf errlog(BEGIN, "symtab_add_args() {");
426*2775Sraf if (Symtab.Args == NULL) {
427*2775Sraf Symtab.Args = create_entry_table(10);
428*2775Sraf }
429*2775Sraf Symtab.Args = add_entry_table(Symtab.Args,
430*2775Sraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
431*2775Sraf errlog(END, "}");
432*2775Sraf }
433*2775Sraf
434*2775Sraf static int curr_arg;
435*2775Sraf
436*2775Sraf ENTRY *
symtab_get_first_arg(void)437*2775Sraf symtab_get_first_arg(void)
438*2775Sraf {
439*2775Sraf
440*2775Sraf errlog(BEGIN, "symtab_get_first_arg() {"); errlog(END, "}");
441*2775Sraf curr_arg = 1;
442*2775Sraf return (get_entry_table(Symtab.Args, 0));
443*2775Sraf }
444*2775Sraf
445*2775Sraf ENTRY *
symtab_get_next_arg(void)446*2775Sraf symtab_get_next_arg(void)
447*2775Sraf {
448*2775Sraf
449*2775Sraf errlog(BEGIN, "symtab_get_next_arg() {"); errlog(END, "}");
450*2775Sraf return (get_entry_table(Symtab.Args, curr_arg++));
451*2775Sraf }
452*2775Sraf
453*2775Sraf ENTRY *
symtab_get_last_arg(void)454*2775Sraf symtab_get_last_arg(void)
455*2775Sraf {
456*2775Sraf
457*2775Sraf errlog(BEGIN, "symtab_get_last_arg() {"); errlog(END, "}");
458*2775Sraf return (get_entry_table(Symtab.Args, Symtab.Args->used));
459*2775Sraf }
460*2775Sraf
461*2775Sraf void
symtab_add_varargs(char * name,int line,char * file,char * type,char * print)462*2775Sraf symtab_add_varargs(char *name, int line, char *file, char *type, char *print)
463*2775Sraf {
464*2775Sraf
465*2775Sraf errlog(BEGIN, "symtab_add_varargs() {");
466*2775Sraf if (Symtab.Varargs == NULL) {
467*2775Sraf Symtab.Varargs = create_entry_table(10);
468*2775Sraf }
469*2775Sraf Symtab.Varargs = add_entry_table(Symtab.Varargs,
470*2775Sraf name, line, file, PRIMITIVE, type, print, 0, "", -1, -1);
471*2775Sraf errlog(END, "}");
472*2775Sraf }
473*2775Sraf
474*2775Sraf static int curr_vararg;
475*2775Sraf
476*2775Sraf ENTRY *
symtab_get_first_vararg(void)477*2775Sraf symtab_get_first_vararg(void)
478*2775Sraf {
479*2775Sraf
480*2775Sraf errlog(BEGIN, "symtab_get_first_vararg() {"); errlog(END, "}");
481*2775Sraf curr_vararg = 1;
482*2775Sraf return (get_entry_table(Symtab.Varargs, 0));
483*2775Sraf }
484*2775Sraf
485*2775Sraf ENTRY *
symtab_get_next_vararg(void)486*2775Sraf symtab_get_next_vararg(void)
487*2775Sraf {
488*2775Sraf
489*2775Sraf errlog(BEGIN, "symtab_get_next_vararg() {"); errlog(END, "}");
490*2775Sraf return (get_entry_table(Symtab.Varargs, curr_vararg++));
491*2775Sraf }
492*2775Sraf
493*2775Sraf void
symtab_add_globals(char * name,int line,char * file,char * type,char * basetype,int levels)494*2775Sraf symtab_add_globals(char *name, int line, char *file, char *type,
495*2775Sraf char *basetype, int levels)
496*2775Sraf {
497*2775Sraf
498*2775Sraf errlog(BEGIN, "symtab_add_globals() {");
499*2775Sraf if (Symtab.Globals == NULL) {
500*2775Sraf Symtab.Globals = create_entry_table(10);
501*2775Sraf }
502*2775Sraf Symtab.Globals = add_entry_table(Symtab.Globals,
503*2775Sraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
504*2775Sraf errlog(END, "}");
505*2775Sraf }
506*2775Sraf
507*2775Sraf
508*2775Sraf static int curr_global;
509*2775Sraf
510*2775Sraf ENTRY *
symtab_get_first_global(void)511*2775Sraf symtab_get_first_global(void)
512*2775Sraf {
513*2775Sraf
514*2775Sraf errlog(BEGIN, "symtab_get_first_global() {"); errlog(END, "}");
515*2775Sraf curr_global = 1;
516*2775Sraf return (get_entry_table(Symtab.Globals, 0));
517*2775Sraf }
518*2775Sraf
519*2775Sraf ENTRY *
symtab_get_next_global(void)520*2775Sraf symtab_get_next_global(void)
521*2775Sraf {
522*2775Sraf
523*2775Sraf errlog(BEGIN, "symtab_get_next_global() {"); errlog(END, "}");
524*2775Sraf return (get_entry_table(Symtab.Globals, curr_global++));
525*2775Sraf }
526*2775Sraf
527*2775Sraf /*
528*2775Sraf * manually written functions for accessing tables of strings
529*2775Sraf */
530*2775Sraf
531*2775Sraf /*
532*2775Sraf * symtab_add_print_types -- add only non-void print types (due to
533*2775Sraf * parser errors in collect.c, yuck). Also note trick compare...
534*2775Sraf * TBD : common code in db, symtab needs to be
535*2775Sraf * pulled out, as they're getting out of sync.
536*2775Sraf */
537*2775Sraf void
symtab_add_print_types(char * print_type,char * c_type)538*2775Sraf symtab_add_print_types(char *print_type, char *c_type)
539*2775Sraf {
540*2775Sraf char buffer[MAXLINE];
541*2775Sraf
542*2775Sraf errlog(BEGIN, "symtab_add_print_types() {");
543*2775Sraf #ifdef notdef
544*2775Sraf if (strcmp(print_type, "void") == 0 || *print_type == NULL) {
545*2775Sraf errlog(END, "}");
546*2775Sraf return;
547*2775Sraf }
548*2775Sraf #endif
549*2775Sraf (void) snprintf(buffer, sizeof (buffer), "%s, %s", print_type, c_type);
550*2775Sraf if (Symtab.Print_Types == NULL) {
551*2775Sraf Symtab.Print_Types = create_string_table(50);
552*2775Sraf }
553*2775Sraf if (in_string_table(Symtab.Print_Types, print_type) == NO) {
554*2775Sraf Symtab.Print_Types = add_string_table(Symtab.Print_Types,
555*2775Sraf &buffer[0]);
556*2775Sraf }
557*2775Sraf errlog(END, "}");
558*2775Sraf }
559*2775Sraf
560*2775Sraf static table_t *
symtab_free_print_types(table_t * t)561*2775Sraf symtab_free_print_types(table_t *t)
562*2775Sraf {
563*2775Sraf errlog(BEGIN, "symtab_free_print_types() {"); errlog(END, "}");
564*2775Sraf return (free_string_table(t));
565*2775Sraf }
566*2775Sraf
567*2775Sraf
568*2775Sraf static int curr_print_type;
569*2775Sraf
570*2775Sraf char *
symtab_get_first_print_type(void)571*2775Sraf symtab_get_first_print_type(void)
572*2775Sraf {
573*2775Sraf
574*2775Sraf errlog(BEGIN, "symtab_get_first_print_type() {"); errlog(END, "}");
575*2775Sraf curr_print_type = 1;
576*2775Sraf return (get_string_table(Symtab.Print_Types, 0));
577*2775Sraf }
578*2775Sraf
579*2775Sraf char *
symtab_get_next_print_type(void)580*2775Sraf symtab_get_next_print_type(void)
581*2775Sraf {
582*2775Sraf
583*2775Sraf errlog(BEGIN, "symtab_get_next_print_type() {"); errlog(END, "}");
584*2775Sraf return (get_string_table(Symtab.Print_Types, curr_print_type++));
585*2775Sraf }
586*2775Sraf
587*2775Sraf void
symtab_add_includes(char * value)588*2775Sraf symtab_add_includes(char *value)
589*2775Sraf {
590*2775Sraf
591*2775Sraf errlog(BEGIN, "symtab_add_includes() {");
592*2775Sraf if (Symtab.Includes == NULL) {
593*2775Sraf Symtab.Includes = create_string_table(50);
594*2775Sraf }
595*2775Sraf if (in_string_table(Symtab.Includes, value) == NO) {
596*2775Sraf Symtab.Includes = add_string_table(Symtab.Includes, value);
597*2775Sraf }
598*2775Sraf errlog(END, "}");
599*2775Sraf }
600*2775Sraf
601*2775Sraf static int curr_include;
602*2775Sraf
603*2775Sraf char *
symtab_get_first_include(void)604*2775Sraf symtab_get_first_include(void)
605*2775Sraf {
606*2775Sraf
607*2775Sraf errlog(BEGIN, "symtab_get_first_include() {"); errlog(END, "}");
608*2775Sraf curr_include = 1;
609*2775Sraf return (get_string_table(Symtab.Includes, 0));
610*2775Sraf }
611*2775Sraf
612*2775Sraf char *
symtab_get_next_include(void)613*2775Sraf symtab_get_next_include(void)
614*2775Sraf {
615*2775Sraf
616*2775Sraf errlog(BEGIN, "symtab_get_next_include() {"); errlog(END, "}");
617*2775Sraf return (get_string_table(Symtab.Includes, curr_include++));
618*2775Sraf }
619*2775Sraf
620*2775Sraf
621*2775Sraf void
symtab_sort_includes(void)622*2775Sraf symtab_sort_includes(void)
623*2775Sraf {
624*2775Sraf errlog(BEGIN, "symtab_sort_includes() {");
625*2775Sraf sort_string_table(Symtab.Includes);
626*2775Sraf errlog(END, "}");
627*2775Sraf }
628*2775Sraf
629*2775Sraf /*
630*2775Sraf * ENTRYs -- access functions to contents of an entry.
631*2775Sraf */
632*2775Sraf
633*2775Sraf char *
name_of(ENTRY * e)634*2775Sraf name_of(ENTRY *e)
635*2775Sraf {
636*2775Sraf return (e->e_name);
637*2775Sraf }
638*2775Sraf
639*2775Sraf int
validity_of(ENTRY * e)640*2775Sraf validity_of(ENTRY *e)
641*2775Sraf {
642*2775Sraf
643*2775Sraf if (e == NULL)
644*2775Sraf return (NO);
645*2775Sraf else
646*2775Sraf return (e->e_valid);
647*2775Sraf }
648*2775Sraf
649*2775Sraf int
line_of(ENTRY * e)650*2775Sraf line_of(ENTRY *e)
651*2775Sraf {
652*2775Sraf return (e->e_line);
653*2775Sraf }
654*2775Sraf
655*2775Sraf
656*2775Sraf char *
file_of(ENTRY * e)657*2775Sraf file_of(ENTRY *e)
658*2775Sraf {
659*2775Sraf return (e->e_file);
660*2775Sraf }
661*2775Sraf
662*2775Sraf /*
663*2775Sraf * x_type_of -- return (type with an extension: an embedded %s where
664*2775Sraf * the name goes.
665*2775Sraf */
666*2775Sraf char *
x_type_of(ENTRY * e)667*2775Sraf x_type_of(ENTRY *e)
668*2775Sraf {
669*2775Sraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
670*2775Sraf return (e->e_type);
671*2775Sraf else
672*2775Sraf return (NULL);
673*2775Sraf }
674*2775Sraf
675*2775Sraf
676*2775Sraf /*
677*2775Sraf * type_of -- return (just the type, with the %s removed. This is the common
678*2775Sraf * case, and its also the slowest... TBD.
679*2775Sraf */
680*2775Sraf char *
type_of(ENTRY * e)681*2775Sraf type_of(ENTRY *e)
682*2775Sraf {
683*2775Sraf static char buffer[MAXLINE];
684*2775Sraf char *p, *q;
685*2775Sraf
686*2775Sraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) {
687*2775Sraf p = e->e_type;
688*2775Sraf q = &buffer[0];
689*2775Sraf while (*p != NULL) {
690*2775Sraf if (*p == '%') {
691*2775Sraf p += 2;
692*2775Sraf } else {
693*2775Sraf *q++ = *p++;
694*2775Sraf }
695*2775Sraf }
696*2775Sraf *q = NULL;
697*2775Sraf return (strtrim(&buffer[0]));
698*2775Sraf }
699*2775Sraf else
700*2775Sraf return (NULL);
701*2775Sraf }
702*2775Sraf
703*2775Sraf char *
basetype_of(ENTRY * e)704*2775Sraf basetype_of(ENTRY *e)
705*2775Sraf {
706*2775Sraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
707*2775Sraf return (e->e_basetype);
708*2775Sraf else
709*2775Sraf return (NULL);
710*2775Sraf }
711*2775Sraf
712*2775Sraf int
levels_of(ENTRY * e)713*2775Sraf levels_of(ENTRY *e)
714*2775Sraf {
715*2775Sraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
716*2775Sraf return (e->e_levels);
717*2775Sraf else
718*2775Sraf return (NULL);
719*2775Sraf }
720*2775Sraf
721*2775Sraf char *
inverse_of(ENTRY * e)722*2775Sraf inverse_of(ENTRY *e)
723*2775Sraf {
724*2775Sraf
725*2775Sraf if (e != NULL && e->e_kind == COMPOSITE)
726*2775Sraf return (e->e_attribute);
727*2775Sraf else
728*2775Sraf return (NULL);
729*2775Sraf }
730*2775Sraf
731*2775Sraf char *
selector_of(ENTRY * e)732*2775Sraf selector_of(ENTRY *e)
733*2775Sraf {
734*2775Sraf
735*2775Sraf if (e != NULL && e->e_kind == VARARG)
736*2775Sraf return (e->e_attribute);
737*2775Sraf else
738*2775Sraf return (NULL);
739*2775Sraf }
740*2775Sraf
741*2775Sraf int
preuses_of(ENTRY * e)742*2775Sraf preuses_of(ENTRY *e)
743*2775Sraf {
744*2775Sraf
745*2775Sraf if (e)
746*2775Sraf return (e->e_pre_uses);
747*2775Sraf else
748*2775Sraf return (-1);
749*2775Sraf }
750*2775Sraf
751*2775Sraf int
postuses_of(ENTRY * e)752*2775Sraf postuses_of(ENTRY *e)
753*2775Sraf {
754*2775Sraf
755*2775Sraf if (e)
756*2775Sraf return (e->e_post_uses);
757*2775Sraf else
758*2775Sraf return (-1);
759*2775Sraf }
760*2775Sraf
761*2775Sraf
762*2775Sraf /*
763*2775Sraf * allocate_entry -- make a parameter list into a complete
764*2775Sraf * ENTRY struct, allocated dynamically.
765*2775Sraf */
766*2775Sraf /* ARGSUSED -- lint bug */
767*2775Sraf static ENTRY *
allocate_entry(ENTRY * e,char * name,int line,char * file,int kind,char * type,char * basetype,int levels,char * attribute,int npre,int npost)768*2775Sraf allocate_entry(ENTRY *e,
769*2775Sraf char *name, int line, char *file,
770*2775Sraf int kind, char *type, char *basetype, int levels, char *attribute,
771*2775Sraf int npre, int npost)
772*2775Sraf {
773*2775Sraf
774*2775Sraf errlog(BEGIN, "allocate_entry() {");
775*2775Sraf if (e == NULL) {
776*2775Sraf if ((e = (ENTRY *)calloc(1, sizeof (ENTRY))) == NULL) {
777*2775Sraf errlog(FATAL, "can't allocate space for an ENTRY");
778*2775Sraf }
779*2775Sraf }
780*2775Sraf errlog(END, "}");
781*2775Sraf return (set_entry(e, name, line, file, kind, type, basetype, levels,
782*2775Sraf attribute, npre, npost));
783*2775Sraf }
784*2775Sraf
785*2775Sraf /*
786*2775Sraf * set_entry -- set a passed-in entry, using
787*2775Sraf * passed parameters, to values suitable for a
788*2775Sraf * symtab entry
789*2775Sraf */
790*2775Sraf static ENTRY *
set_entry(ENTRY * e,char * name,int line,char * file,int kind,char * type,char * basetype,int levels,char * attribute,int npre,int npost)791*2775Sraf set_entry(ENTRY *e,
792*2775Sraf char *name, int line, char *file,
793*2775Sraf int kind, char *type, char *basetype, int levels, char *attribute,
794*2775Sraf int npre, int npost)
795*2775Sraf {
796*2775Sraf
797*2775Sraf errlog(BEGIN, "set_entry() {");
798*2775Sraf if (e == NULL) {
799*2775Sraf errlog(FATAL, "programmer error: passed a NULL ENTRY");
800*2775Sraf }
801*2775Sraf e->e_name = strset(e->e_name, name);
802*2775Sraf e->e_valid = YES;
803*2775Sraf e->e_line = line,
804*2775Sraf e->e_file = strset(e->e_file, file);
805*2775Sraf e->e_kind = kind;
806*2775Sraf switch (kind) {
807*2775Sraf case PRIMITIVE:
808*2775Sraf e->e_type = strset(e->e_type, type);
809*2775Sraf e->e_basetype = strset(e->e_basetype, basetype);
810*2775Sraf e->e_levels = levels;
811*2775Sraf break;
812*2775Sraf case COMPOSITE:
813*2775Sraf e->e_attribute = strset(e->e_attribute, attribute);
814*2775Sraf break;
815*2775Sraf case VARARG:
816*2775Sraf e->e_attribute = strset(e->e_attribute, attribute);
817*2775Sraf break;
818*2775Sraf default:
819*2775Sraf errlog(FATAL, "programmer error: impossible kind of ENTRY");
820*2775Sraf }
821*2775Sraf
822*2775Sraf e->e_pre_uses = npre;
823*2775Sraf e->e_post_uses = npost;
824*2775Sraf errlog(END, "}");
825*2775Sraf return (e);
826*2775Sraf }
827*2775Sraf
828*2775Sraf
829*2775Sraf /*
830*2775Sraf * free_entry -- really just mark an entry as invalid
831*2775Sraf */
832*2775Sraf static ENTRY *
free_entry(ENTRY * e)833*2775Sraf free_entry(ENTRY *e)
834*2775Sraf {
835*2775Sraf if (e != NULL)
836*2775Sraf e->e_valid = NO;
837*2775Sraf return (e);
838*2775Sraf }
839*2775Sraf
840*2775Sraf
841*2775Sraf /*
842*2775Sraf * ENTRY tables.
843*2775Sraf */
844*2775Sraf #define ENTRY_INCREMENT 10
845*2775Sraf
846*2775Sraf static EHEAD *
create_entry_table(int n)847*2775Sraf create_entry_table(int n)
848*2775Sraf {
849*2775Sraf EHEAD *p;
850*2775Sraf
851*2775Sraf errlog(BEGIN, "create_entry_table() {");
852*2775Sraf if ((p = (EHEAD *)calloc(1,
853*2775Sraf sizeof (EHEAD)+(n*sizeof (ENTRY)))) == NULL) {
854*2775Sraf errlog(FATAL, "can't allocate space for an ENTRY table");
855*2775Sraf }
856*2775Sraf p->used = -1;
857*2775Sraf p->n_entries = n;
858*2775Sraf errlog(END, "}");
859*2775Sraf return (p);
860*2775Sraf }
861*2775Sraf
862*2775Sraf static EHEAD *
add_entry_table(EHEAD * t,char * name,int line,char * file,int kind,char * type,char * basetype,int levels,char * attribute,int npre,int npost)863*2775Sraf add_entry_table(EHEAD *t, char *name, int line, char *file,
864*2775Sraf int kind, char *type, char *basetype, int levels, char *attribute,
865*2775Sraf int npre, int npost)
866*2775Sraf {
867*2775Sraf EHEAD *t2;
868*2775Sraf
869*2775Sraf errlog(BEGIN, "add_entry_table() {");
870*2775Sraf if (t == NULL) {
871*2775Sraf errlog(FATAL, "programmer error: tried to add to NULL EHEAD");
872*2775Sraf }
873*2775Sraf t->used++;
874*2775Sraf if (t->used >= t->n_entries) {
875*2775Sraf if ((t2 = (EHEAD *)realloc(t,
876*2775Sraf sizeof (EHEAD)+(sizeof (ENTRY)*
877*2775Sraf (t->n_entries+ENTRY_INCREMENT)))) == NULL) {
878*2775Sraf errlog(FATAL, "out of memory extending an EHEAD");
879*2775Sraf }
880*2775Sraf t = t2;
881*2775Sraf clear_entries(t, t->n_entries, (t->n_entries+ENTRY_INCREMENT));
882*2775Sraf t->n_entries += ENTRY_INCREMENT;
883*2775Sraf }
884*2775Sraf (void) set_entry(&t->entry[t->used],
885*2775Sraf name, line, file, kind, type, basetype, levels,
886*2775Sraf attribute, npre, npost);
887*2775Sraf errlog(END, "}");
888*2775Sraf return (t);
889*2775Sraf }
890*2775Sraf
891*2775Sraf static ENTRY *
get_entry_table(EHEAD * t,int index)892*2775Sraf get_entry_table(EHEAD *t, int index)
893*2775Sraf {
894*2775Sraf if (t == NULL) {
895*2775Sraf return (NULL);
896*2775Sraf } else if (index > t->used) {
897*2775Sraf return (NULL);
898*2775Sraf } else {
899*2775Sraf return (&(t->entry[index]));
900*2775Sraf }
901*2775Sraf }
902*2775Sraf
903*2775Sraf static EHEAD *
free_entry_table(EHEAD * t)904*2775Sraf free_entry_table(EHEAD *t)
905*2775Sraf {
906*2775Sraf if (t != NULL)
907*2775Sraf t->used = -1;
908*2775Sraf return (t);
909*2775Sraf }
910*2775Sraf
911*2775Sraf static void
clear_entries(EHEAD * t,int start,int end)912*2775Sraf clear_entries(EHEAD *t, int start, int end)
913*2775Sraf {
914*2775Sraf int i;
915*2775Sraf
916*2775Sraf for (i = start; i < end; i++) {
917*2775Sraf (void) memset(&t->entry[i], 0, sizeof (ENTRY));
918*2775Sraf }
919*2775Sraf }
920