17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  * Copyright (c) 1997-1999 by Sun Microsystems, Inc.
247c478bd9Sstevel@tonic-gate  * All rights reserved.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #include <stdio.h>
287c478bd9Sstevel@tonic-gate #include <string.h>
297c478bd9Sstevel@tonic-gate #include <limits.h>
307c478bd9Sstevel@tonic-gate #include <malloc.h>
317c478bd9Sstevel@tonic-gate #include "parser.h"
327c478bd9Sstevel@tonic-gate #include "trace.h"
337c478bd9Sstevel@tonic-gate #include "util.h"
347c478bd9Sstevel@tonic-gate #include "symtab.h"
357c478bd9Sstevel@tonic-gate #include "errlog.h"
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate /* Types */
387c478bd9Sstevel@tonic-gate enum kind_t { PRIMITIVE = 0, COMPOSITE, VARARG };
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate struct entry_t {
417c478bd9Sstevel@tonic-gate 	char	*e_name;
427c478bd9Sstevel@tonic-gate 	int	e_valid;
437c478bd9Sstevel@tonic-gate 	int	e_line;
447c478bd9Sstevel@tonic-gate 	char	*e_file;
457c478bd9Sstevel@tonic-gate 	int	e_kind;		/* PRIMITIVE, COMPOSITE... */
467c478bd9Sstevel@tonic-gate 	char	*e_type;	/* where kind == PRIMITIVE */
477c478bd9Sstevel@tonic-gate 	/* base type, ie. char if e_type is char */
487c478bd9Sstevel@tonic-gate 	char	*e_basetype;
497c478bd9Sstevel@tonic-gate 	int	e_levels;	/* levels of indirection */
507c478bd9Sstevel@tonic-gate 	char	*e_attribute;	/* kind == COMPOSITE or VARARG. */
517c478bd9Sstevel@tonic-gate 	char	*e_assertion;	/* reserved for kind == VARARG. */
527c478bd9Sstevel@tonic-gate 	char	*e_comment;	/* reserved for per-element comments. */
537c478bd9Sstevel@tonic-gate 	int	e_pre_uses;
547c478bd9Sstevel@tonic-gate 	int	e_post_uses;
557c478bd9Sstevel@tonic-gate };
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate typedef struct entry_head_t {
587c478bd9Sstevel@tonic-gate 	int	used;
597c478bd9Sstevel@tonic-gate 	int	n_entries;
607c478bd9Sstevel@tonic-gate 	ENTRY	entry[1]; /* Actually entry[n_entries]. */
617c478bd9Sstevel@tonic-gate } EHEAD;
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate static struct symtab_t {
647c478bd9Sstevel@tonic-gate 	ENTRY	*Function;
657c478bd9Sstevel@tonic-gate 	EHEAD	*Args;
667c478bd9Sstevel@tonic-gate 	EHEAD	*Varargs;
677c478bd9Sstevel@tonic-gate 	EHEAD	*Globals;
687c478bd9Sstevel@tonic-gate 	ENTRY	*Errval;
697c478bd9Sstevel@tonic-gate 
707c478bd9Sstevel@tonic-gate 	/* Includes */
717c478bd9Sstevel@tonic-gate 	table_t	*Includes;
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate 	/* Bindings */
747c478bd9Sstevel@tonic-gate 	ENTRY	*Exception;
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate 	/* Types */
777c478bd9Sstevel@tonic-gate 	table_t	*Print_Types;
787c478bd9Sstevel@tonic-gate 
797c478bd9Sstevel@tonic-gate 	/* Error-message information. */
807c478bd9Sstevel@tonic-gate 	int	Line;
817c478bd9Sstevel@tonic-gate 	char	Filename[MAXLINE];
827c478bd9Sstevel@tonic-gate 
837c478bd9Sstevel@tonic-gate 	/* Trace additions */
847c478bd9Sstevel@tonic-gate 	char	Prototype[MAXLINE];
857c478bd9Sstevel@tonic-gate 	char	Formals[MAXLINE];
867c478bd9Sstevel@tonic-gate 	char	Actuals[MAXLINE];
877c478bd9Sstevel@tonic-gate 	char	Cast[MAXLINE];
887c478bd9Sstevel@tonic-gate 	int	Nonreturn;
897c478bd9Sstevel@tonic-gate 	int	Skip;
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate 	/* Adl additions */
927c478bd9Sstevel@tonic-gate 	/* various assertions, one hopes */
937c478bd9Sstevel@tonic-gate } Symtab;
947c478bd9Sstevel@tonic-gate 
957c478bd9Sstevel@tonic-gate /* File Globals. */
967c478bd9Sstevel@tonic-gate static EHEAD *create_entry_table(int);
977c478bd9Sstevel@tonic-gate static EHEAD *add_entry_table(EHEAD *,
987c478bd9Sstevel@tonic-gate 	char *, int, char *, int, char *, char *, int, char *, int, int);
997c478bd9Sstevel@tonic-gate static ENTRY *get_entry_table(EHEAD *, int);
1007c478bd9Sstevel@tonic-gate static EHEAD *free_entry_table(EHEAD *);
1017c478bd9Sstevel@tonic-gate static void clear_entries(EHEAD *, int, int);
1027c478bd9Sstevel@tonic-gate static ENTRY *allocate_entry(ENTRY *, char *, int, char *, int,
1037c478bd9Sstevel@tonic-gate     char *, char *, int, char *, int, int);
1047c478bd9Sstevel@tonic-gate static ENTRY *set_entry(ENTRY *,
1057c478bd9Sstevel@tonic-gate 	char *, int, char *, int, char *, char *, int, char *, int, int);
1067c478bd9Sstevel@tonic-gate static ENTRY *free_entry(ENTRY *);
1077c478bd9Sstevel@tonic-gate static void symtab_clear_varargs(void);
1087c478bd9Sstevel@tonic-gate static void symtab_clear_globals(void);
1097c478bd9Sstevel@tonic-gate static void symtab_clear_print_types(void);
1107c478bd9Sstevel@tonic-gate static void symtab_set_nonreturn(int);
1117c478bd9Sstevel@tonic-gate static table_t *symtab_free_print_types(table_t *);
1127c478bd9Sstevel@tonic-gate 
1137c478bd9Sstevel@tonic-gate /*
1147c478bd9Sstevel@tonic-gate  * symtab_new_function -- clear counts, variables for a new function.
1157c478bd9Sstevel@tonic-gate  */
1167c478bd9Sstevel@tonic-gate void
symtab_new_function(const int line,const char * file)1177c478bd9Sstevel@tonic-gate symtab_new_function(const int line, const char *file)
1187c478bd9Sstevel@tonic-gate {
1197c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_new_function() {");
1207c478bd9Sstevel@tonic-gate 	Symtab.Line = line;	/* Set, don't clear. */
1217c478bd9Sstevel@tonic-gate 	symtab_set_filename(file);
1227c478bd9Sstevel@tonic-gate 
1237c478bd9Sstevel@tonic-gate 	symtab_clear_function();
1247c478bd9Sstevel@tonic-gate 	symtab_clear_varargs();
1257c478bd9Sstevel@tonic-gate 	symtab_clear_globals();
1267c478bd9Sstevel@tonic-gate 	symtab_clear_errval();
1277c478bd9Sstevel@tonic-gate 	symtab_clear_exception();
1287c478bd9Sstevel@tonic-gate 	symtab_clear_print_types();
1297c478bd9Sstevel@tonic-gate 
1307c478bd9Sstevel@tonic-gate 	symtab_set_nonreturn(NO);
1317c478bd9Sstevel@tonic-gate 	symtab_set_skip(NO);
1327c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1337c478bd9Sstevel@tonic-gate }
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 
1367c478bd9Sstevel@tonic-gate /*
1377c478bd9Sstevel@tonic-gate  * symtab_clear_function -- clear function-prototype-derived
1387c478bd9Sstevel@tonic-gate  *	values. Called on each prototype line and at beginning
1397c478bd9Sstevel@tonic-gate  *	of interface.
1407c478bd9Sstevel@tonic-gate  */
1417c478bd9Sstevel@tonic-gate void
symtab_clear_function(void)1427c478bd9Sstevel@tonic-gate symtab_clear_function(void)
1437c478bd9Sstevel@tonic-gate {
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_function() {");
1467c478bd9Sstevel@tonic-gate 	Symtab.Function = free_entry(Symtab.Function);
1477c478bd9Sstevel@tonic-gate 	Symtab.Args = free_entry_table(Symtab.Args);
148*07c94cbfSToomas Soome 	Symtab.Prototype[0] = '\0';
149*07c94cbfSToomas Soome 	Symtab.Formals[0] = '\0';
150*07c94cbfSToomas Soome 	Symtab.Actuals[0] = '\0';
151*07c94cbfSToomas Soome 	Symtab.Cast[0] = '\0';
1527c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1537c478bd9Sstevel@tonic-gate }
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate 
1567c478bd9Sstevel@tonic-gate /*
1577c478bd9Sstevel@tonic-gate  * symtab_clear_varargs -- called only at end
1587c478bd9Sstevel@tonic-gate  */
1597c478bd9Sstevel@tonic-gate static void
symtab_clear_varargs(void)1607c478bd9Sstevel@tonic-gate symtab_clear_varargs(void)
1617c478bd9Sstevel@tonic-gate {
1627c478bd9Sstevel@tonic-gate 
1637c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_varargs() {");
1647c478bd9Sstevel@tonic-gate 	Symtab.Varargs = free_entry_table(Symtab.Varargs);
1657c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1667c478bd9Sstevel@tonic-gate }
1677c478bd9Sstevel@tonic-gate 
1687c478bd9Sstevel@tonic-gate /*
1697c478bd9Sstevel@tonic-gate  * symtab_clear_includes -- clear only at end of file (union++)
1707c478bd9Sstevel@tonic-gate  */
1717c478bd9Sstevel@tonic-gate void
symtab_clear_includes(void)1727c478bd9Sstevel@tonic-gate symtab_clear_includes(void)
1737c478bd9Sstevel@tonic-gate {
1747c478bd9Sstevel@tonic-gate 
1757c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_includes() {");
1767c478bd9Sstevel@tonic-gate 	Symtab.Includes = free_string_table(Symtab.Includes);
1777c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1787c478bd9Sstevel@tonic-gate }
1797c478bd9Sstevel@tonic-gate 
1807c478bd9Sstevel@tonic-gate static void
symtab_clear_globals(void)1817c478bd9Sstevel@tonic-gate symtab_clear_globals(void)
1827c478bd9Sstevel@tonic-gate {
1837c478bd9Sstevel@tonic-gate 
1847c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_globals() {");
1857c478bd9Sstevel@tonic-gate 	Symtab.Globals = free_entry_table(Symtab.Globals);
1867c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1877c478bd9Sstevel@tonic-gate }
1887c478bd9Sstevel@tonic-gate 
1897c478bd9Sstevel@tonic-gate void
symtab_clear_errval(void)1907c478bd9Sstevel@tonic-gate symtab_clear_errval(void)
1917c478bd9Sstevel@tonic-gate {
1927c478bd9Sstevel@tonic-gate 
1937c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_errval() {");
1947c478bd9Sstevel@tonic-gate 	Symtab.Errval = free_entry(Symtab.Errval);
1957c478bd9Sstevel@tonic-gate 	errlog(END, "}");
1967c478bd9Sstevel@tonic-gate }
1977c478bd9Sstevel@tonic-gate 
1987c478bd9Sstevel@tonic-gate void
symtab_clear_exception(void)1997c478bd9Sstevel@tonic-gate symtab_clear_exception(void)
2007c478bd9Sstevel@tonic-gate {
2017c478bd9Sstevel@tonic-gate 
2027c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_exception() {");
2037c478bd9Sstevel@tonic-gate 	Symtab.Exception = free_entry(Symtab.Exception);
2047c478bd9Sstevel@tonic-gate 	errlog(END, "}");
2057c478bd9Sstevel@tonic-gate }
2067c478bd9Sstevel@tonic-gate 
2077c478bd9Sstevel@tonic-gate static void
symtab_clear_print_types(void)2087c478bd9Sstevel@tonic-gate symtab_clear_print_types(void)
2097c478bd9Sstevel@tonic-gate {
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_clear_print_types() {");
2127c478bd9Sstevel@tonic-gate 	Symtab.Print_Types = symtab_free_print_types(Symtab.Print_Types);
2137c478bd9Sstevel@tonic-gate 	errlog(END, "}");
2147c478bd9Sstevel@tonic-gate }
2157c478bd9Sstevel@tonic-gate 
2167c478bd9Sstevel@tonic-gate 
2177c478bd9Sstevel@tonic-gate /* Generated by m4 -- character string values */
2187c478bd9Sstevel@tonic-gate 
2197c478bd9Sstevel@tonic-gate void
symtab_set_prototype(char * p)2207c478bd9Sstevel@tonic-gate symtab_set_prototype(char *p)
2217c478bd9Sstevel@tonic-gate {
2227c478bd9Sstevel@tonic-gate 
2237c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_prototype(void) {");
2247c478bd9Sstevel@tonic-gate 	(void) strncpy(Symtab.Prototype, p, sizeof (Symtab.Prototype));
225*07c94cbfSToomas Soome 	Symtab.Prototype[sizeof (Symtab.Prototype)-1] = '\0';
2267c478bd9Sstevel@tonic-gate 	errlog(END, "}");
2277c478bd9Sstevel@tonic-gate }
2287c478bd9Sstevel@tonic-gate 
2297c478bd9Sstevel@tonic-gate char *
symtab_get_prototype(void)2307c478bd9Sstevel@tonic-gate symtab_get_prototype(void)
2317c478bd9Sstevel@tonic-gate {
2327c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_prototype() {"); errlog(END, "}");
2337c478bd9Sstevel@tonic-gate 	return (Symtab.Prototype);
2347c478bd9Sstevel@tonic-gate }
2357c478bd9Sstevel@tonic-gate 
2367c478bd9Sstevel@tonic-gate void
symtab_set_formals(char * p)2377c478bd9Sstevel@tonic-gate symtab_set_formals(char *p)
2387c478bd9Sstevel@tonic-gate {
2397c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_formals() {");
2407c478bd9Sstevel@tonic-gate 	errlog(VERBOSE, "p = %s", p);
2417c478bd9Sstevel@tonic-gate 	(void) strncpy(Symtab.Formals, p, sizeof (Symtab.Formals));
242*07c94cbfSToomas Soome 	Symtab.Formals[sizeof (Symtab.Formals)-1] = '\0';
2437c478bd9Sstevel@tonic-gate 	errlog(END, "}");
2447c478bd9Sstevel@tonic-gate }
2457c478bd9Sstevel@tonic-gate 
2467c478bd9Sstevel@tonic-gate char *
symtab_get_formals(void)2477c478bd9Sstevel@tonic-gate symtab_get_formals(void)
2487c478bd9Sstevel@tonic-gate {
2497c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_formals() {"); errlog(END, "}");
2507c478bd9Sstevel@tonic-gate 	return (Symtab.Formals);
2517c478bd9Sstevel@tonic-gate }
2527c478bd9Sstevel@tonic-gate 
2537c478bd9Sstevel@tonic-gate void
symtab_set_actuals(char * p)2547c478bd9Sstevel@tonic-gate symtab_set_actuals(char *p)
2557c478bd9Sstevel@tonic-gate {
2567c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_actuals() {"); errlog(END, "}");
2577c478bd9Sstevel@tonic-gate 	errlog(VERBOSE, "p = %s", p);
2587c478bd9Sstevel@tonic-gate 	(void) strncpy(Symtab.Actuals, p, sizeof (Symtab.Actuals));
259*07c94cbfSToomas Soome 	Symtab.Actuals[sizeof (Symtab.Actuals)-1] = '\0';
2607c478bd9Sstevel@tonic-gate }
2617c478bd9Sstevel@tonic-gate 
2627c478bd9Sstevel@tonic-gate char *
symtab_get_actuals(void)2637c478bd9Sstevel@tonic-gate symtab_get_actuals(void)
2647c478bd9Sstevel@tonic-gate {
2657c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_actuals() {"); errlog(END, "}");
2667c478bd9Sstevel@tonic-gate 	return (Symtab.Actuals);
2677c478bd9Sstevel@tonic-gate }
2687c478bd9Sstevel@tonic-gate 
2697c478bd9Sstevel@tonic-gate void
symtab_set_cast(char * p)2707c478bd9Sstevel@tonic-gate symtab_set_cast(char *p)
2717c478bd9Sstevel@tonic-gate {
2727c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_cast() {"); errlog(END, "}");
2737c478bd9Sstevel@tonic-gate 	(void) strncpy(Symtab.Cast, p, sizeof (Symtab.Cast));
274*07c94cbfSToomas Soome 	Symtab.Cast[sizeof (Symtab.Cast)-1] = '\0';
2757c478bd9Sstevel@tonic-gate }
2767c478bd9Sstevel@tonic-gate 
2777c478bd9Sstevel@tonic-gate char *
symtab_get_cast(void)2787c478bd9Sstevel@tonic-gate symtab_get_cast(void)
2797c478bd9Sstevel@tonic-gate {
2807c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_cast() {"); errlog(END, "}");
2817c478bd9Sstevel@tonic-gate 	return (Symtab.Cast);
2827c478bd9Sstevel@tonic-gate }
2837c478bd9Sstevel@tonic-gate 
2847c478bd9Sstevel@tonic-gate 
2857c478bd9Sstevel@tonic-gate void
symtab_set_filename(const char * p)2867c478bd9Sstevel@tonic-gate symtab_set_filename(const char *p)
2877c478bd9Sstevel@tonic-gate {
2887c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_filename() {"); errlog(END, "}");
2897c478bd9Sstevel@tonic-gate 	(void) strncpy(Symtab.Filename, p, sizeof (Symtab.Filename));
290*07c94cbfSToomas Soome 	Symtab.Filename[sizeof (Symtab.Filename)-1] = '\0';
2917c478bd9Sstevel@tonic-gate }
2927c478bd9Sstevel@tonic-gate 
2937c478bd9Sstevel@tonic-gate char *
symtab_get_filename(void)2947c478bd9Sstevel@tonic-gate symtab_get_filename(void)
2957c478bd9Sstevel@tonic-gate {
2967c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_filename() {"); errlog(END, "}");
2977c478bd9Sstevel@tonic-gate 	return (Symtab.Filename);
2987c478bd9Sstevel@tonic-gate }
2997c478bd9Sstevel@tonic-gate 
3007c478bd9Sstevel@tonic-gate 
3017c478bd9Sstevel@tonic-gate /* Generated by m4 -- int values */
3027c478bd9Sstevel@tonic-gate 
3037c478bd9Sstevel@tonic-gate static void
symtab_set_nonreturn(int val)3047c478bd9Sstevel@tonic-gate symtab_set_nonreturn(int val)
3057c478bd9Sstevel@tonic-gate {
3067c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_nonreturn() {"); errlog(END, "}");
3077c478bd9Sstevel@tonic-gate 	Symtab.Nonreturn = val;
3087c478bd9Sstevel@tonic-gate }
3097c478bd9Sstevel@tonic-gate 
3107c478bd9Sstevel@tonic-gate int
symtab_get_nonreturn(void)3117c478bd9Sstevel@tonic-gate symtab_get_nonreturn(void)
3127c478bd9Sstevel@tonic-gate {
3137c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_nonreturn() {"); errlog(END, "}");
3147c478bd9Sstevel@tonic-gate 	return (Symtab.Nonreturn);
3157c478bd9Sstevel@tonic-gate }
3167c478bd9Sstevel@tonic-gate 
3177c478bd9Sstevel@tonic-gate void
symtab_set_line(int val)3187c478bd9Sstevel@tonic-gate symtab_set_line(int val)
3197c478bd9Sstevel@tonic-gate {
3207c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_line() {"); errlog(END, "}");
3217c478bd9Sstevel@tonic-gate 	Symtab.Line = val;
3227c478bd9Sstevel@tonic-gate }
3237c478bd9Sstevel@tonic-gate 
3247c478bd9Sstevel@tonic-gate int
symtab_get_line(void)3257c478bd9Sstevel@tonic-gate symtab_get_line(void)
3267c478bd9Sstevel@tonic-gate {
3277c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_line() {"); errlog(END, "}");
3287c478bd9Sstevel@tonic-gate 	return (Symtab.Line);
3297c478bd9Sstevel@tonic-gate }
3307c478bd9Sstevel@tonic-gate 
3317c478bd9Sstevel@tonic-gate 
3327c478bd9Sstevel@tonic-gate void
symtab_set_skip(int value)3337c478bd9Sstevel@tonic-gate symtab_set_skip(int value)
3347c478bd9Sstevel@tonic-gate {
3357c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_skip() {"); errlog(END, "}");
3367c478bd9Sstevel@tonic-gate 	Symtab.Skip = value;
3377c478bd9Sstevel@tonic-gate }
3387c478bd9Sstevel@tonic-gate 
3397c478bd9Sstevel@tonic-gate int
symtab_get_skip(void)3407c478bd9Sstevel@tonic-gate symtab_get_skip(void)
3417c478bd9Sstevel@tonic-gate {
3427c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_skip() {"); errlog(END, "}");
3437c478bd9Sstevel@tonic-gate 	return (Symtab.Skip);
3447c478bd9Sstevel@tonic-gate }
3457c478bd9Sstevel@tonic-gate 
3467c478bd9Sstevel@tonic-gate /*
3477c478bd9Sstevel@tonic-gate  * Manually written access functions for ENTRY * variables.
3487c478bd9Sstevel@tonic-gate  */
3497c478bd9Sstevel@tonic-gate 
3507c478bd9Sstevel@tonic-gate void
symtab_set_function(char * name,int line,char * file,char * type,char * basetype,int levels)3517c478bd9Sstevel@tonic-gate symtab_set_function(char *name, int line, char *file,
3527c478bd9Sstevel@tonic-gate     char *type, char *basetype, int levels)
3537c478bd9Sstevel@tonic-gate {
3547c478bd9Sstevel@tonic-gate 
3557c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_function() {");
3567c478bd9Sstevel@tonic-gate 	Symtab.Function = allocate_entry(Symtab.Function,
3577c478bd9Sstevel@tonic-gate 	    name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
3587c478bd9Sstevel@tonic-gate 	errlog(END, "}");
3597c478bd9Sstevel@tonic-gate }
3607c478bd9Sstevel@tonic-gate 
3617c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_function(void)3627c478bd9Sstevel@tonic-gate symtab_get_function(void)
3637c478bd9Sstevel@tonic-gate {
3647c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_function() {"); errlog(END, "}");
3657c478bd9Sstevel@tonic-gate 	if (Symtab.Function == NULL)
3667c478bd9Sstevel@tonic-gate 		return (NULL);
3677c478bd9Sstevel@tonic-gate 	else
3687c478bd9Sstevel@tonic-gate 		return ((Symtab.Function->e_valid)? Symtab.Function: NULL);
3697c478bd9Sstevel@tonic-gate }
3707c478bd9Sstevel@tonic-gate 
3717c478bd9Sstevel@tonic-gate void
symtab_set_exception(char * value,int line,char * file)3727c478bd9Sstevel@tonic-gate symtab_set_exception(char *value, int line, char *file)
3737c478bd9Sstevel@tonic-gate {
3747c478bd9Sstevel@tonic-gate 
3757c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_exception() {");
3767c478bd9Sstevel@tonic-gate 	Symtab.Exception = allocate_entry(Symtab.Exception,
3777c478bd9Sstevel@tonic-gate 		value, line, file, COMPOSITE, "", "", 0, "", -1, -1);
3787c478bd9Sstevel@tonic-gate 	errlog(END, "}");
3797c478bd9Sstevel@tonic-gate }
3807c478bd9Sstevel@tonic-gate 
3817c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_exception(void)3827c478bd9Sstevel@tonic-gate symtab_get_exception(void)
3837c478bd9Sstevel@tonic-gate {
3847c478bd9Sstevel@tonic-gate 
3857c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_exception() {"); errlog(END, "}");
3867c478bd9Sstevel@tonic-gate 	if (Symtab.Exception == NULL)
3877c478bd9Sstevel@tonic-gate 		return (NULL);
3887c478bd9Sstevel@tonic-gate 	else
3897c478bd9Sstevel@tonic-gate 		return ((Symtab.Exception->e_valid)? Symtab.Exception: NULL);
3907c478bd9Sstevel@tonic-gate }
3917c478bd9Sstevel@tonic-gate 
3927c478bd9Sstevel@tonic-gate void
symtab_set_errval(char * name,int line,char * file,char * type,char * basetype,int levels)3937c478bd9Sstevel@tonic-gate symtab_set_errval(char *name, int line, char *file, char *type, char *basetype,
3947c478bd9Sstevel@tonic-gate     int levels)
3957c478bd9Sstevel@tonic-gate {
3967c478bd9Sstevel@tonic-gate 
3977c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_set_errval() {");
3987c478bd9Sstevel@tonic-gate 	Symtab.Errval = allocate_entry(Symtab.Errval,
3997c478bd9Sstevel@tonic-gate 	    name, line, file, PRIMITIVE, type, basetype, levels,
4007c478bd9Sstevel@tonic-gate 	    "", -1, -1);
4017c478bd9Sstevel@tonic-gate 	errlog(END, "}");
4027c478bd9Sstevel@tonic-gate }
4037c478bd9Sstevel@tonic-gate 
4047c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_errval(void)4057c478bd9Sstevel@tonic-gate symtab_get_errval(void)
4067c478bd9Sstevel@tonic-gate {
4077c478bd9Sstevel@tonic-gate 
4087c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_errval() {"); errlog(END, "}");
4097c478bd9Sstevel@tonic-gate 	if (Symtab.Errval == NULL)
4107c478bd9Sstevel@tonic-gate 		return (NULL);
4117c478bd9Sstevel@tonic-gate 	else
4127c478bd9Sstevel@tonic-gate 		return ((Symtab.Errval->e_valid)? Symtab.Errval: NULL);
4137c478bd9Sstevel@tonic-gate }
4147c478bd9Sstevel@tonic-gate 
4157c478bd9Sstevel@tonic-gate /*
4167c478bd9Sstevel@tonic-gate  * Manually written  access function for tables of ENTRYs
4177c478bd9Sstevel@tonic-gate  */
4187c478bd9Sstevel@tonic-gate void
symtab_add_args(char * name,int line,char * file,char * type,char * basetype,int levels)4197c478bd9Sstevel@tonic-gate symtab_add_args(char *name, int line, char *file,
4207c478bd9Sstevel@tonic-gate     char *type, char *basetype, int levels)
4217c478bd9Sstevel@tonic-gate {
4227c478bd9Sstevel@tonic-gate 
4237c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_add_args() {");
4247c478bd9Sstevel@tonic-gate 	if (Symtab.Args == NULL) {
4257c478bd9Sstevel@tonic-gate 		Symtab.Args = create_entry_table(10);
4267c478bd9Sstevel@tonic-gate 	}
4277c478bd9Sstevel@tonic-gate 	Symtab.Args = add_entry_table(Symtab.Args,
4287c478bd9Sstevel@tonic-gate 	    name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
4297c478bd9Sstevel@tonic-gate 	errlog(END, "}");
4307c478bd9Sstevel@tonic-gate }
4317c478bd9Sstevel@tonic-gate 
4327c478bd9Sstevel@tonic-gate static int curr_arg;
4337c478bd9Sstevel@tonic-gate 
4347c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_first_arg(void)4357c478bd9Sstevel@tonic-gate symtab_get_first_arg(void)
4367c478bd9Sstevel@tonic-gate {
4377c478bd9Sstevel@tonic-gate 
4387c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_first_arg() {"); errlog(END, "}");
4397c478bd9Sstevel@tonic-gate 	curr_arg = 1;
4407c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Args, 0));
4417c478bd9Sstevel@tonic-gate }
4427c478bd9Sstevel@tonic-gate 
4437c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_next_arg(void)4447c478bd9Sstevel@tonic-gate symtab_get_next_arg(void)
4457c478bd9Sstevel@tonic-gate {
4467c478bd9Sstevel@tonic-gate 
4477c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_next_arg() {"); errlog(END, "}");
4487c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Args, curr_arg++));
4497c478bd9Sstevel@tonic-gate }
4507c478bd9Sstevel@tonic-gate 
4517c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_last_arg(void)4527c478bd9Sstevel@tonic-gate symtab_get_last_arg(void)
4537c478bd9Sstevel@tonic-gate {
4547c478bd9Sstevel@tonic-gate 
4557c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_last_arg() {"); errlog(END, "}");
4567c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Args, Symtab.Args->used));
4577c478bd9Sstevel@tonic-gate }
4587c478bd9Sstevel@tonic-gate 
4597c478bd9Sstevel@tonic-gate void
symtab_add_varargs(char * name,int line,char * file,char * type,char * print)4607c478bd9Sstevel@tonic-gate symtab_add_varargs(char *name, int line, char *file, char *type, char *print)
4617c478bd9Sstevel@tonic-gate {
4627c478bd9Sstevel@tonic-gate 
4637c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_add_varargs() {");
4647c478bd9Sstevel@tonic-gate 	if (Symtab.Varargs == NULL) {
4657c478bd9Sstevel@tonic-gate 		Symtab.Varargs = create_entry_table(10);
4667c478bd9Sstevel@tonic-gate 	}
4677c478bd9Sstevel@tonic-gate 	Symtab.Varargs = add_entry_table(Symtab.Varargs,
4687c478bd9Sstevel@tonic-gate 		name, line, file, PRIMITIVE, type, print, 0, "", -1, -1);
4697c478bd9Sstevel@tonic-gate 	errlog(END, "}");
4707c478bd9Sstevel@tonic-gate }
4717c478bd9Sstevel@tonic-gate 
4727c478bd9Sstevel@tonic-gate static int curr_vararg;
4737c478bd9Sstevel@tonic-gate 
4747c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_first_vararg(void)4757c478bd9Sstevel@tonic-gate symtab_get_first_vararg(void)
4767c478bd9Sstevel@tonic-gate {
4777c478bd9Sstevel@tonic-gate 
4787c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_first_vararg() {"); errlog(END, "}");
4797c478bd9Sstevel@tonic-gate 	curr_vararg = 1;
4807c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Varargs, 0));
4817c478bd9Sstevel@tonic-gate }
4827c478bd9Sstevel@tonic-gate 
4837c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_next_vararg(void)4847c478bd9Sstevel@tonic-gate symtab_get_next_vararg(void)
4857c478bd9Sstevel@tonic-gate {
4867c478bd9Sstevel@tonic-gate 
4877c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_next_vararg() {"); errlog(END, "}");
4887c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Varargs, curr_vararg++));
4897c478bd9Sstevel@tonic-gate }
4907c478bd9Sstevel@tonic-gate 
4917c478bd9Sstevel@tonic-gate void
symtab_add_globals(char * name,int line,char * file,char * type,char * basetype,int levels)4927c478bd9Sstevel@tonic-gate symtab_add_globals(char *name, int line, char *file, char *type,
4937c478bd9Sstevel@tonic-gate     char *basetype, int levels)
4947c478bd9Sstevel@tonic-gate {
4957c478bd9Sstevel@tonic-gate 
4967c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_add_globals() {");
4977c478bd9Sstevel@tonic-gate 	if (Symtab.Globals == NULL) {
4987c478bd9Sstevel@tonic-gate 		Symtab.Globals = create_entry_table(10);
4997c478bd9Sstevel@tonic-gate 	}
5007c478bd9Sstevel@tonic-gate 	Symtab.Globals = add_entry_table(Symtab.Globals,
5017c478bd9Sstevel@tonic-gate 	    name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1);
5027c478bd9Sstevel@tonic-gate 	errlog(END, "}");
5037c478bd9Sstevel@tonic-gate }
5047c478bd9Sstevel@tonic-gate 
5057c478bd9Sstevel@tonic-gate 
5067c478bd9Sstevel@tonic-gate static int curr_global;
5077c478bd9Sstevel@tonic-gate 
5087c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_first_global(void)5097c478bd9Sstevel@tonic-gate symtab_get_first_global(void)
5107c478bd9Sstevel@tonic-gate {
5117c478bd9Sstevel@tonic-gate 
5127c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_first_global() {"); errlog(END, "}");
5137c478bd9Sstevel@tonic-gate 	curr_global = 1;
5147c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Globals, 0));
5157c478bd9Sstevel@tonic-gate }
5167c478bd9Sstevel@tonic-gate 
5177c478bd9Sstevel@tonic-gate ENTRY *
symtab_get_next_global(void)5187c478bd9Sstevel@tonic-gate symtab_get_next_global(void)
5197c478bd9Sstevel@tonic-gate {
5207c478bd9Sstevel@tonic-gate 
5217c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_next_global() {"); errlog(END, "}");
5227c478bd9Sstevel@tonic-gate 	return (get_entry_table(Symtab.Globals, curr_global++));
5237c478bd9Sstevel@tonic-gate }
5247c478bd9Sstevel@tonic-gate 
5257c478bd9Sstevel@tonic-gate /*
5267c478bd9Sstevel@tonic-gate  * manually written functions for accessing tables of strings
5277c478bd9Sstevel@tonic-gate  */
5287c478bd9Sstevel@tonic-gate 
5297c478bd9Sstevel@tonic-gate /*
5307c478bd9Sstevel@tonic-gate  * symtab_add_print_types -- add only non-void print types (due to
5317c478bd9Sstevel@tonic-gate  *	parser errors in collect.c, yuck). Also note trick compare...
5327c478bd9Sstevel@tonic-gate  *	TBD : common code in db, symtab needs to be
5337c478bd9Sstevel@tonic-gate  *	pulled out, as they're getting out of sync.
5347c478bd9Sstevel@tonic-gate  */
5357c478bd9Sstevel@tonic-gate void
symtab_add_print_types(char * print_type,char * c_type)5367c478bd9Sstevel@tonic-gate symtab_add_print_types(char *print_type, char *c_type)
5377c478bd9Sstevel@tonic-gate {
5387c478bd9Sstevel@tonic-gate 	char	buffer[MAXLINE];
5397c478bd9Sstevel@tonic-gate 
5407c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_add_print_types() {");
5417c478bd9Sstevel@tonic-gate #ifdef notdef
5427c478bd9Sstevel@tonic-gate 	if (strcmp(print_type, "void") == 0 || *print_type == NULL) {
5437c478bd9Sstevel@tonic-gate 		errlog(END, "}");
5447c478bd9Sstevel@tonic-gate 		return;
5457c478bd9Sstevel@tonic-gate 	}
5467c478bd9Sstevel@tonic-gate #endif
5477c478bd9Sstevel@tonic-gate 	(void) snprintf(buffer, sizeof (buffer), "%s, %s", print_type, c_type);
5487c478bd9Sstevel@tonic-gate 	if (Symtab.Print_Types == NULL) {
5497c478bd9Sstevel@tonic-gate 	Symtab.Print_Types = create_string_table(50);
5507c478bd9Sstevel@tonic-gate 	}
5517c478bd9Sstevel@tonic-gate 	if (in_string_table(Symtab.Print_Types, print_type) == NO) {
5527c478bd9Sstevel@tonic-gate 		Symtab.Print_Types = add_string_table(Symtab.Print_Types,
5537c478bd9Sstevel@tonic-gate 					&buffer[0]);
5547c478bd9Sstevel@tonic-gate 	}
5557c478bd9Sstevel@tonic-gate 	errlog(END, "}");
5567c478bd9Sstevel@tonic-gate }
5577c478bd9Sstevel@tonic-gate 
5587c478bd9Sstevel@tonic-gate static table_t *
symtab_free_print_types(table_t * t)5597c478bd9Sstevel@tonic-gate symtab_free_print_types(table_t *t)
5607c478bd9Sstevel@tonic-gate {
5617c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_free_print_types() {"); errlog(END, "}");
5627c478bd9Sstevel@tonic-gate 	return (free_string_table(t));
5637c478bd9Sstevel@tonic-gate }
5647c478bd9Sstevel@tonic-gate 
5657c478bd9Sstevel@tonic-gate 
5667c478bd9Sstevel@tonic-gate static int curr_print_type;
5677c478bd9Sstevel@tonic-gate 
5687c478bd9Sstevel@tonic-gate char *
symtab_get_first_print_type(void)5697c478bd9Sstevel@tonic-gate symtab_get_first_print_type(void)
5707c478bd9Sstevel@tonic-gate {
5717c478bd9Sstevel@tonic-gate 
5727c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_first_print_type() {"); errlog(END, "}");
5737c478bd9Sstevel@tonic-gate 	curr_print_type = 1;
5747c478bd9Sstevel@tonic-gate 	return (get_string_table(Symtab.Print_Types, 0));
5757c478bd9Sstevel@tonic-gate }
5767c478bd9Sstevel@tonic-gate 
5777c478bd9Sstevel@tonic-gate char *
symtab_get_next_print_type(void)5787c478bd9Sstevel@tonic-gate symtab_get_next_print_type(void)
5797c478bd9Sstevel@tonic-gate {
5807c478bd9Sstevel@tonic-gate 
5817c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_next_print_type() {"); errlog(END, "}");
5827c478bd9Sstevel@tonic-gate 	return (get_string_table(Symtab.Print_Types, curr_print_type++));
5837c478bd9Sstevel@tonic-gate }
5847c478bd9Sstevel@tonic-gate 
5857c478bd9Sstevel@tonic-gate void
symtab_add_includes(char * value)5867c478bd9Sstevel@tonic-gate symtab_add_includes(char *value)
5877c478bd9Sstevel@tonic-gate {
5887c478bd9Sstevel@tonic-gate 
5897c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_add_includes() {");
5907c478bd9Sstevel@tonic-gate 	if (Symtab.Includes == NULL) {
5917c478bd9Sstevel@tonic-gate 		Symtab.Includes = create_string_table(50);
5927c478bd9Sstevel@tonic-gate 	}
5937c478bd9Sstevel@tonic-gate 	if (in_string_table(Symtab.Includes, value) == NO) {
5947c478bd9Sstevel@tonic-gate 		Symtab.Includes = add_string_table(Symtab.Includes, value);
5957c478bd9Sstevel@tonic-gate 	}
5967c478bd9Sstevel@tonic-gate 	errlog(END, "}");
5977c478bd9Sstevel@tonic-gate }
5987c478bd9Sstevel@tonic-gate 
5997c478bd9Sstevel@tonic-gate static int curr_include;
6007c478bd9Sstevel@tonic-gate 
6017c478bd9Sstevel@tonic-gate char *
symtab_get_first_include(void)6027c478bd9Sstevel@tonic-gate symtab_get_first_include(void)
6037c478bd9Sstevel@tonic-gate {
6047c478bd9Sstevel@tonic-gate 
6057c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_first_include() {"); errlog(END, "}");
6067c478bd9Sstevel@tonic-gate 	curr_include = 1;
6077c478bd9Sstevel@tonic-gate 	return (get_string_table(Symtab.Includes, 0));
6087c478bd9Sstevel@tonic-gate }
6097c478bd9Sstevel@tonic-gate 
6107c478bd9Sstevel@tonic-gate char *
symtab_get_next_include(void)6117c478bd9Sstevel@tonic-gate symtab_get_next_include(void)
6127c478bd9Sstevel@tonic-gate {
6137c478bd9Sstevel@tonic-gate 
6147c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_get_next_include() {"); errlog(END, "}");
6157c478bd9Sstevel@tonic-gate 	return (get_string_table(Symtab.Includes, curr_include++));
6167c478bd9Sstevel@tonic-gate }
6177c478bd9Sstevel@tonic-gate 
6187c478bd9Sstevel@tonic-gate 
6197c478bd9Sstevel@tonic-gate void
symtab_sort_includes(void)6207c478bd9Sstevel@tonic-gate symtab_sort_includes(void)
6217c478bd9Sstevel@tonic-gate {
6227c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "symtab_sort_includes() {");
6237c478bd9Sstevel@tonic-gate 	sort_string_table(Symtab.Includes);
6247c478bd9Sstevel@tonic-gate 	errlog(END, "}");
6257c478bd9Sstevel@tonic-gate }
6267c478bd9Sstevel@tonic-gate 
6277c478bd9Sstevel@tonic-gate /*
6287c478bd9Sstevel@tonic-gate  * ENTRYs  -- access functions to contents of an entry.
6297c478bd9Sstevel@tonic-gate  */
6307c478bd9Sstevel@tonic-gate 
6317c478bd9Sstevel@tonic-gate char *
name_of(ENTRY * e)6327c478bd9Sstevel@tonic-gate name_of(ENTRY *e)
6337c478bd9Sstevel@tonic-gate {
6347c478bd9Sstevel@tonic-gate 	return (e->e_name);
6357c478bd9Sstevel@tonic-gate }
6367c478bd9Sstevel@tonic-gate 
6377c478bd9Sstevel@tonic-gate int
validity_of(ENTRY * e)6387c478bd9Sstevel@tonic-gate validity_of(ENTRY *e)
6397c478bd9Sstevel@tonic-gate {
6407c478bd9Sstevel@tonic-gate 
6417c478bd9Sstevel@tonic-gate 	if (e == NULL)
6427c478bd9Sstevel@tonic-gate 		return (NO);
6437c478bd9Sstevel@tonic-gate 	else
6447c478bd9Sstevel@tonic-gate 		return (e->e_valid);
6457c478bd9Sstevel@tonic-gate }
6467c478bd9Sstevel@tonic-gate 
6477c478bd9Sstevel@tonic-gate int
line_of(ENTRY * e)6487c478bd9Sstevel@tonic-gate line_of(ENTRY *e)
6497c478bd9Sstevel@tonic-gate {
6507c478bd9Sstevel@tonic-gate 	return (e->e_line);
6517c478bd9Sstevel@tonic-gate }
6527c478bd9Sstevel@tonic-gate 
6537c478bd9Sstevel@tonic-gate 
6547c478bd9Sstevel@tonic-gate char *
file_of(ENTRY * e)6557c478bd9Sstevel@tonic-gate file_of(ENTRY *e)
6567c478bd9Sstevel@tonic-gate {
6577c478bd9Sstevel@tonic-gate 	return (e->e_file);
6587c478bd9Sstevel@tonic-gate }
6597c478bd9Sstevel@tonic-gate 
6607c478bd9Sstevel@tonic-gate /*
6617c478bd9Sstevel@tonic-gate  * x_type_of -- return (type with an extension: an embedded %s where
6627c478bd9Sstevel@tonic-gate  *	the name goes.
6637c478bd9Sstevel@tonic-gate  */
6647c478bd9Sstevel@tonic-gate char *
x_type_of(ENTRY * e)6657c478bd9Sstevel@tonic-gate x_type_of(ENTRY *e)
6667c478bd9Sstevel@tonic-gate {
6677c478bd9Sstevel@tonic-gate 	if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
6687c478bd9Sstevel@tonic-gate 		return (e->e_type);
6697c478bd9Sstevel@tonic-gate 	else
6707c478bd9Sstevel@tonic-gate 		return (NULL);
6717c478bd9Sstevel@tonic-gate }
6727c478bd9Sstevel@tonic-gate 
6737c478bd9Sstevel@tonic-gate 
6747c478bd9Sstevel@tonic-gate /*
6757c478bd9Sstevel@tonic-gate  * type_of -- return (just the type, with the %s removed. This is the common
6767c478bd9Sstevel@tonic-gate  *	case, and its also the slowest... TBD.
6777c478bd9Sstevel@tonic-gate  */
6787c478bd9Sstevel@tonic-gate char *
type_of(ENTRY * e)6797c478bd9Sstevel@tonic-gate type_of(ENTRY *e)
6807c478bd9Sstevel@tonic-gate {
6817c478bd9Sstevel@tonic-gate 	static char buffer[MAXLINE];
6827c478bd9Sstevel@tonic-gate 	char	*p, *q;
6837c478bd9Sstevel@tonic-gate 
6847c478bd9Sstevel@tonic-gate 	if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) {
6857c478bd9Sstevel@tonic-gate 		p = e->e_type;
6867c478bd9Sstevel@tonic-gate 		q = &buffer[0];
687*07c94cbfSToomas Soome 		while (*p != '\0') {
6887c478bd9Sstevel@tonic-gate 			if (*p == '%') {
6897c478bd9Sstevel@tonic-gate 				p += 2;
6907c478bd9Sstevel@tonic-gate 			} else {
6917c478bd9Sstevel@tonic-gate 				*q++ = *p++;
6927c478bd9Sstevel@tonic-gate 			}
6937c478bd9Sstevel@tonic-gate 		}
694*07c94cbfSToomas Soome 		*q = '\0';
6957c478bd9Sstevel@tonic-gate 		return (strtrim(&buffer[0]));
6967c478bd9Sstevel@tonic-gate 	}
6977c478bd9Sstevel@tonic-gate 	else
6987c478bd9Sstevel@tonic-gate 		return (NULL);
6997c478bd9Sstevel@tonic-gate }
7007c478bd9Sstevel@tonic-gate 
7017c478bd9Sstevel@tonic-gate char *
basetype_of(ENTRY * e)7027c478bd9Sstevel@tonic-gate basetype_of(ENTRY *e)
7037c478bd9Sstevel@tonic-gate {
7047c478bd9Sstevel@tonic-gate 	if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
7057c478bd9Sstevel@tonic-gate 		return (e->e_basetype);
7067c478bd9Sstevel@tonic-gate 	else
7077c478bd9Sstevel@tonic-gate 		return (NULL);
7087c478bd9Sstevel@tonic-gate }
7097c478bd9Sstevel@tonic-gate 
7107c478bd9Sstevel@tonic-gate int
levels_of(ENTRY * e)7117c478bd9Sstevel@tonic-gate levels_of(ENTRY *e)
7127c478bd9Sstevel@tonic-gate {
7137c478bd9Sstevel@tonic-gate 	if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG))
7147c478bd9Sstevel@tonic-gate 		return (e->e_levels);
7157c478bd9Sstevel@tonic-gate 	else
716*07c94cbfSToomas Soome 		return (0);
7177c478bd9Sstevel@tonic-gate }
7187c478bd9Sstevel@tonic-gate 
7197c478bd9Sstevel@tonic-gate char *
inverse_of(ENTRY * e)7207c478bd9Sstevel@tonic-gate inverse_of(ENTRY *e)
7217c478bd9Sstevel@tonic-gate {
7227c478bd9Sstevel@tonic-gate 
7237c478bd9Sstevel@tonic-gate 	if (e != NULL && e->e_kind == COMPOSITE)
7247c478bd9Sstevel@tonic-gate 		return (e->e_attribute);
7257c478bd9Sstevel@tonic-gate 	else
7267c478bd9Sstevel@tonic-gate 		return (NULL);
7277c478bd9Sstevel@tonic-gate }
7287c478bd9Sstevel@tonic-gate 
7297c478bd9Sstevel@tonic-gate char *
selector_of(ENTRY * e)7307c478bd9Sstevel@tonic-gate selector_of(ENTRY *e)
7317c478bd9Sstevel@tonic-gate {
7327c478bd9Sstevel@tonic-gate 
7337c478bd9Sstevel@tonic-gate 	if (e != NULL && e->e_kind == VARARG)
7347c478bd9Sstevel@tonic-gate 		return (e->e_attribute);
7357c478bd9Sstevel@tonic-gate 	else
7367c478bd9Sstevel@tonic-gate 		return (NULL);
7377c478bd9Sstevel@tonic-gate }
7387c478bd9Sstevel@tonic-gate 
7397c478bd9Sstevel@tonic-gate int
preuses_of(ENTRY * e)7407c478bd9Sstevel@tonic-gate preuses_of(ENTRY *e)
7417c478bd9Sstevel@tonic-gate {
7427c478bd9Sstevel@tonic-gate 
7437c478bd9Sstevel@tonic-gate 	if (e)
7447c478bd9Sstevel@tonic-gate 		return (e->e_pre_uses);
7457c478bd9Sstevel@tonic-gate 	else
7467c478bd9Sstevel@tonic-gate 		return (-1);
7477c478bd9Sstevel@tonic-gate }
7487c478bd9Sstevel@tonic-gate 
7497c478bd9Sstevel@tonic-gate int
postuses_of(ENTRY * e)7507c478bd9Sstevel@tonic-gate postuses_of(ENTRY *e)
7517c478bd9Sstevel@tonic-gate {
7527c478bd9Sstevel@tonic-gate 
7537c478bd9Sstevel@tonic-gate 	if (e)
7547c478bd9Sstevel@tonic-gate 		return (e->e_post_uses);
7557c478bd9Sstevel@tonic-gate 	else
7567c478bd9Sstevel@tonic-gate 		return (-1);
7577c478bd9Sstevel@tonic-gate }
7587c478bd9Sstevel@tonic-gate 
7597c478bd9Sstevel@tonic-gate 
7607c478bd9Sstevel@tonic-gate /*
7617c478bd9Sstevel@tonic-gate  * allocate_entry -- make a parameter list into a complete
7627c478bd9Sstevel@tonic-gate  *	ENTRY struct, allocated dynamically.
7637c478bd9Sstevel@tonic-gate  */
7647c478bd9Sstevel@tonic-gate 	/* ARGSUSED -- lint bug */
7657c478bd9Sstevel@tonic-gate 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)7667c478bd9Sstevel@tonic-gate allocate_entry(ENTRY *e,
7677c478bd9Sstevel@tonic-gate     char *name, int line, char *file,
7687c478bd9Sstevel@tonic-gate     int kind, char *type, char *basetype, int levels, char *attribute,
7697c478bd9Sstevel@tonic-gate     int npre, int npost)
7707c478bd9Sstevel@tonic-gate {
7717c478bd9Sstevel@tonic-gate 
7727c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "allocate_entry() {");
7737c478bd9Sstevel@tonic-gate 	if (e == NULL) {
7747c478bd9Sstevel@tonic-gate 		if ((e = (ENTRY *)calloc(1, sizeof (ENTRY))) == NULL) {
7757c478bd9Sstevel@tonic-gate 			errlog(FATAL, "can't allocate space for an ENTRY");
7767c478bd9Sstevel@tonic-gate 		}
7777c478bd9Sstevel@tonic-gate 	}
7787c478bd9Sstevel@tonic-gate 	errlog(END, "}");
7797c478bd9Sstevel@tonic-gate 	return (set_entry(e, name, line, file, kind, type, basetype, levels,
7807c478bd9Sstevel@tonic-gate 			attribute, npre, npost));
7817c478bd9Sstevel@tonic-gate }
7827c478bd9Sstevel@tonic-gate 
7837c478bd9Sstevel@tonic-gate /*
7847c478bd9Sstevel@tonic-gate  * set_entry -- set a passed-in entry, using
7857c478bd9Sstevel@tonic-gate  *	passed parameters, to values suitable for a
7867c478bd9Sstevel@tonic-gate  *	symtab entry
7877c478bd9Sstevel@tonic-gate  */
7887c478bd9Sstevel@tonic-gate 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)7897c478bd9Sstevel@tonic-gate set_entry(ENTRY *e,
7907c478bd9Sstevel@tonic-gate     char *name, int line, char *file,
7917c478bd9Sstevel@tonic-gate     int kind, char *type, char *basetype, int levels, char *attribute,
7927c478bd9Sstevel@tonic-gate     int npre, int npost)
7937c478bd9Sstevel@tonic-gate {
7947c478bd9Sstevel@tonic-gate 
7957c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "set_entry() {");
7967c478bd9Sstevel@tonic-gate 	if (e == NULL) {
7977c478bd9Sstevel@tonic-gate 		errlog(FATAL, "programmer error: passed a NULL ENTRY");
7987c478bd9Sstevel@tonic-gate 	}
7997c478bd9Sstevel@tonic-gate 	e->e_name = strset(e->e_name, name);
8007c478bd9Sstevel@tonic-gate 	e->e_valid = YES;
8017c478bd9Sstevel@tonic-gate 	e->e_line = line,
8027c478bd9Sstevel@tonic-gate 	e->e_file = strset(e->e_file, file);
8037c478bd9Sstevel@tonic-gate 	e->e_kind = kind;
8047c478bd9Sstevel@tonic-gate 	switch (kind) {
8057c478bd9Sstevel@tonic-gate 	case PRIMITIVE:
8067c478bd9Sstevel@tonic-gate 		e->e_type = strset(e->e_type, type);
8077c478bd9Sstevel@tonic-gate 		e->e_basetype = strset(e->e_basetype, basetype);
8087c478bd9Sstevel@tonic-gate 		e->e_levels = levels;
8097c478bd9Sstevel@tonic-gate 		break;
8107c478bd9Sstevel@tonic-gate 	case COMPOSITE:
8117c478bd9Sstevel@tonic-gate 		e->e_attribute = strset(e->e_attribute, attribute);
8127c478bd9Sstevel@tonic-gate 		break;
8137c478bd9Sstevel@tonic-gate 	case VARARG:
8147c478bd9Sstevel@tonic-gate 		e->e_attribute = strset(e->e_attribute, attribute);
8157c478bd9Sstevel@tonic-gate 		break;
8167c478bd9Sstevel@tonic-gate 	default:
8177c478bd9Sstevel@tonic-gate 		errlog(FATAL, "programmer error: impossible kind of ENTRY");
8187c478bd9Sstevel@tonic-gate 	}
8197c478bd9Sstevel@tonic-gate 
8207c478bd9Sstevel@tonic-gate 	e->e_pre_uses = npre;
8217c478bd9Sstevel@tonic-gate 	e->e_post_uses = npost;
8227c478bd9Sstevel@tonic-gate 	errlog(END, "}");
8237c478bd9Sstevel@tonic-gate 	return (e);
8247c478bd9Sstevel@tonic-gate }
8257c478bd9Sstevel@tonic-gate 
8267c478bd9Sstevel@tonic-gate 
8277c478bd9Sstevel@tonic-gate /*
8287c478bd9Sstevel@tonic-gate  * free_entry -- really just mark an entry as invalid
8297c478bd9Sstevel@tonic-gate  */
8307c478bd9Sstevel@tonic-gate static ENTRY *
free_entry(ENTRY * e)8317c478bd9Sstevel@tonic-gate free_entry(ENTRY *e)
8327c478bd9Sstevel@tonic-gate {
8337c478bd9Sstevel@tonic-gate 	if (e != NULL)
8347c478bd9Sstevel@tonic-gate 		e->e_valid = NO;
8357c478bd9Sstevel@tonic-gate 	return (e);
8367c478bd9Sstevel@tonic-gate }
8377c478bd9Sstevel@tonic-gate 
8387c478bd9Sstevel@tonic-gate 
8397c478bd9Sstevel@tonic-gate /*
8407c478bd9Sstevel@tonic-gate  * ENTRY tables.
8417c478bd9Sstevel@tonic-gate  */
8427c478bd9Sstevel@tonic-gate #define	ENTRY_INCREMENT 10
8437c478bd9Sstevel@tonic-gate 
8447c478bd9Sstevel@tonic-gate static EHEAD *
create_entry_table(int n)8457c478bd9Sstevel@tonic-gate create_entry_table(int n)
8467c478bd9Sstevel@tonic-gate {
8477c478bd9Sstevel@tonic-gate 	EHEAD	*p;
8487c478bd9Sstevel@tonic-gate 
8497c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "create_entry_table() {");
8507c478bd9Sstevel@tonic-gate 	if ((p = (EHEAD *)calloc(1,
8517c478bd9Sstevel@tonic-gate 	    sizeof (EHEAD)+(n*sizeof (ENTRY)))) == NULL) {
8527c478bd9Sstevel@tonic-gate 		errlog(FATAL, "can't allocate space for an ENTRY table");
8537c478bd9Sstevel@tonic-gate 	}
8547c478bd9Sstevel@tonic-gate 	p->used = -1;
8557c478bd9Sstevel@tonic-gate 	p->n_entries = n;
8567c478bd9Sstevel@tonic-gate 	errlog(END, "}");
8577c478bd9Sstevel@tonic-gate 	return (p);
8587c478bd9Sstevel@tonic-gate }
8597c478bd9Sstevel@tonic-gate 
8607c478bd9Sstevel@tonic-gate 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)8617c478bd9Sstevel@tonic-gate add_entry_table(EHEAD *t, char *name, int line, char *file,
8627c478bd9Sstevel@tonic-gate     int kind, char *type, char *basetype, int levels, char *attribute,
8637c478bd9Sstevel@tonic-gate     int npre, int npost)
8647c478bd9Sstevel@tonic-gate {
8657c478bd9Sstevel@tonic-gate 	EHEAD	*t2;
8667c478bd9Sstevel@tonic-gate 
8677c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "add_entry_table() {");
8687c478bd9Sstevel@tonic-gate 	if (t == NULL) {
8697c478bd9Sstevel@tonic-gate 		errlog(FATAL, "programmer error: tried to add to NULL EHEAD");
8707c478bd9Sstevel@tonic-gate 	}
8717c478bd9Sstevel@tonic-gate 	t->used++;
8727c478bd9Sstevel@tonic-gate 	if (t->used >= t->n_entries) {
8737c478bd9Sstevel@tonic-gate 		if ((t2 = (EHEAD *)realloc(t,
8747c478bd9Sstevel@tonic-gate 			sizeof (EHEAD)+(sizeof (ENTRY)*
8757c478bd9Sstevel@tonic-gate 				(t->n_entries+ENTRY_INCREMENT)))) == NULL) {
8767c478bd9Sstevel@tonic-gate 			errlog(FATAL, "out of memory extending an EHEAD");
8777c478bd9Sstevel@tonic-gate 		}
8787c478bd9Sstevel@tonic-gate 		t = t2;
8797c478bd9Sstevel@tonic-gate 		clear_entries(t, t->n_entries, (t->n_entries+ENTRY_INCREMENT));
8807c478bd9Sstevel@tonic-gate 		t->n_entries += ENTRY_INCREMENT;
8817c478bd9Sstevel@tonic-gate 	}
8827c478bd9Sstevel@tonic-gate 	(void) set_entry(&t->entry[t->used],
8837c478bd9Sstevel@tonic-gate 	    name, line, file, kind, type, basetype, levels,
8847c478bd9Sstevel@tonic-gate 	    attribute, npre, npost);
8857c478bd9Sstevel@tonic-gate 	errlog(END, "}");
8867c478bd9Sstevel@tonic-gate 	return (t);
8877c478bd9Sstevel@tonic-gate }
8887c478bd9Sstevel@tonic-gate 
8897c478bd9Sstevel@tonic-gate static ENTRY *
get_entry_table(EHEAD * t,int index)8907c478bd9Sstevel@tonic-gate get_entry_table(EHEAD *t, int index)
8917c478bd9Sstevel@tonic-gate {
8927c478bd9Sstevel@tonic-gate 	if (t == NULL)  {
8937c478bd9Sstevel@tonic-gate 		return (NULL);
8947c478bd9Sstevel@tonic-gate 	} else if (index > t->used) {
8957c478bd9Sstevel@tonic-gate 		return (NULL);
8967c478bd9Sstevel@tonic-gate 	} else {
8977c478bd9Sstevel@tonic-gate 		return (&(t->entry[index]));
8987c478bd9Sstevel@tonic-gate 	}
8997c478bd9Sstevel@tonic-gate }
9007c478bd9Sstevel@tonic-gate 
9017c478bd9Sstevel@tonic-gate static EHEAD *
free_entry_table(EHEAD * t)9027c478bd9Sstevel@tonic-gate free_entry_table(EHEAD *t)
9037c478bd9Sstevel@tonic-gate {
9047c478bd9Sstevel@tonic-gate 	if (t != NULL)
9057c478bd9Sstevel@tonic-gate 		t->used = -1;
9067c478bd9Sstevel@tonic-gate 	return (t);
9077c478bd9Sstevel@tonic-gate }
9087c478bd9Sstevel@tonic-gate 
9097c478bd9Sstevel@tonic-gate static void
clear_entries(EHEAD * t,int start,int end)9107c478bd9Sstevel@tonic-gate clear_entries(EHEAD *t, int start, int end)
9117c478bd9Sstevel@tonic-gate {
9127c478bd9Sstevel@tonic-gate 	int	i;
9137c478bd9Sstevel@tonic-gate 
9147c478bd9Sstevel@tonic-gate 	for (i = start; i < end; i++) {
9157c478bd9Sstevel@tonic-gate 		(void) memset(&t->entry[i], 0, sizeof (ENTRY));
9167c478bd9Sstevel@tonic-gate 	}
9177c478bd9Sstevel@tonic-gate }
918