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
symtab_new_function(const int line,const char * file)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
symtab_clear_function(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
symtab_clear_varargs(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
symtab_clear_includes(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
symtab_clear_globals(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
symtab_clear_errval(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
symtab_clear_exception(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
symtab_clear_print_types(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
symtab_set_prototype(char * p)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 *
symtab_get_prototype(void)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
symtab_set_formals(char * p)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 *
symtab_get_formals(void)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
symtab_set_actuals(char * p)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 *
symtab_get_actuals(void)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
symtab_set_cast(char * p)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 *
symtab_get_cast(void)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
symtab_set_filename(const char * p)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 *
symtab_get_filename(void)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
symtab_set_nonreturn(int val)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
symtab_get_nonreturn(void)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
symtab_set_line(int val)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
symtab_get_line(void)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
symtab_set_skip(int value)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
symtab_get_skip(void)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
symtab_set_function(char * name,int line,char * file,char * type,char * basetype,int levels)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 *
symtab_get_function(void)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
symtab_set_exception(char * value,int line,char * file)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 *
symtab_get_exception(void)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
symtab_set_errval(char * name,int line,char * file,char * type,char * basetype,int levels)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 *
symtab_get_errval(void)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
symtab_add_args(char * name,int line,char * file,char * type,char * basetype,int levels)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 *
symtab_get_first_arg(void)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 *
symtab_get_next_arg(void)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 *
symtab_get_last_arg(void)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
symtab_add_varargs(char * name,int line,char * file,char * type,char * print)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 *
symtab_get_first_vararg(void)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 *
symtab_get_next_vararg(void)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
symtab_add_globals(char * name,int line,char * file,char * type,char * basetype,int levels)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 *
symtab_get_first_global(void)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 *
symtab_get_next_global(void)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
symtab_add_print_types(char * print_type,char * c_type)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 *
symtab_free_print_types(table_t * 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 *
symtab_get_first_print_type(void)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 *
symtab_get_next_print_type(void)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
symtab_add_includes(char * value)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 *
symtab_get_first_include(void)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 *
symtab_get_next_include(void)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
symtab_sort_includes(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 *
name_of(ENTRY * e)634*753d2d2eSraf name_of(ENTRY *e)
635*753d2d2eSraf {
636*753d2d2eSraf return (e->e_name);
637*753d2d2eSraf }
638*753d2d2eSraf
639*753d2d2eSraf int
validity_of(ENTRY * e)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
line_of(ENTRY * e)650*753d2d2eSraf line_of(ENTRY *e)
651*753d2d2eSraf {
652*753d2d2eSraf return (e->e_line);
653*753d2d2eSraf }
654*753d2d2eSraf
655*753d2d2eSraf
656*753d2d2eSraf char *
file_of(ENTRY * e)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 *
x_type_of(ENTRY * e)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 *
type_of(ENTRY * e)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 *
basetype_of(ENTRY * e)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
levels_of(ENTRY * e)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 *
inverse_of(ENTRY * e)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 *
selector_of(ENTRY * e)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
preuses_of(ENTRY * e)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
postuses_of(ENTRY * e)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 *
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*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 *
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*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 *
free_entry(ENTRY * e)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 *
create_entry_table(int n)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 *
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*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 *
get_entry_table(EHEAD * t,int index)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 *
free_entry_table(EHEAD * t)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
clear_entries(EHEAD * t,int start,int end)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