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