1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright (c) 1997-1999 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate  * All rights reserved.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
28*7c478bd9Sstevel@tonic-gate 
29*7c478bd9Sstevel@tonic-gate /*
30*7c478bd9Sstevel@tonic-gate  * db.c -- the tiny database for trace.  Only stores
31*7c478bd9Sstevel@tonic-gate  *	global things: see symtab for per-function data.
32*7c478bd9Sstevel@tonic-gate  *
33*7c478bd9Sstevel@tonic-gate  */
34*7c478bd9Sstevel@tonic-gate 
35*7c478bd9Sstevel@tonic-gate #include <stdio.h>
36*7c478bd9Sstevel@tonic-gate #include <string.h>
37*7c478bd9Sstevel@tonic-gate #include <libgen.h>
38*7c478bd9Sstevel@tonic-gate #include <limits.h>
39*7c478bd9Sstevel@tonic-gate #include <sys/param.h>
40*7c478bd9Sstevel@tonic-gate #include "parser.h"
41*7c478bd9Sstevel@tonic-gate #include "trace.h"
42*7c478bd9Sstevel@tonic-gate #include "util.h"
43*7c478bd9Sstevel@tonic-gate #include "errlog.h"
44*7c478bd9Sstevel@tonic-gate #include "db.h"
45*7c478bd9Sstevel@tonic-gate 
46*7c478bd9Sstevel@tonic-gate static int curr_print_type;
47*7c478bd9Sstevel@tonic-gate 
48*7c478bd9Sstevel@tonic-gate static struct {
49*7c478bd9Sstevel@tonic-gate 	char	Current_Library[PATH_MAX];
50*7c478bd9Sstevel@tonic-gate 	char	Current_File[PATH_MAX];
51*7c478bd9Sstevel@tonic-gate 	char	Output_File[PATH_MAX];
52*7c478bd9Sstevel@tonic-gate 	char	Current_Interface[PATH_MAX];
53*7c478bd9Sstevel@tonic-gate 	char	Source_Directory[PATH_MAX];
54*7c478bd9Sstevel@tonic-gate 	char	Target_Directory[PATH_MAX];
55*7c478bd9Sstevel@tonic-gate 	int	NFiles;
56*7c478bd9Sstevel@tonic-gate 	int	Verbosity;
57*7c478bd9Sstevel@tonic-gate 	char	Library_List[PATH_MAX];
58*7c478bd9Sstevel@tonic-gate 	char	Translator[MAXNAMELEN];
59*7c478bd9Sstevel@tonic-gate 	char	Test_Type[MAXNAMELEN];
60*7c478bd9Sstevel@tonic-gate 	char	Kludge[PATH_MAX];
61*7c478bd9Sstevel@tonic-gate 	int	Flags;
62*7c478bd9Sstevel@tonic-gate 	char const *Arch;
63*7c478bd9Sstevel@tonic-gate 	table_t	*Print_Types;
64*7c478bd9Sstevel@tonic-gate 	table_t	*File;
65*7c478bd9Sstevel@tonic-gate 	table_t	*Exclusions;
66*7c478bd9Sstevel@tonic-gate 
67*7c478bd9Sstevel@tonic-gate } Database;
68*7c478bd9Sstevel@tonic-gate 
69*7c478bd9Sstevel@tonic-gate 
70*7c478bd9Sstevel@tonic-gate /* Generated by m4 -- character string values */
71*7c478bd9Sstevel@tonic-gate void
72*7c478bd9Sstevel@tonic-gate db_set_current_library(char const *p)
73*7c478bd9Sstevel@tonic-gate {
74*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_set_current_library() {");
75*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Current_Library, p,
76*7c478bd9Sstevel@tonic-gate 	    sizeof (Database.Current_Library));
77*7c478bd9Sstevel@tonic-gate 	Database.Current_Library[sizeof (Database.Current_Library) - 1] = NULL;
78*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
79*7c478bd9Sstevel@tonic-gate }
80*7c478bd9Sstevel@tonic-gate 
81*7c478bd9Sstevel@tonic-gate char *
82*7c478bd9Sstevel@tonic-gate db_get_current_library(void)
83*7c478bd9Sstevel@tonic-gate {
84*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_get_current_library() {"); errlog(END, "}");
85*7c478bd9Sstevel@tonic-gate 	return (Database.Current_Library);
86*7c478bd9Sstevel@tonic-gate }
87*7c478bd9Sstevel@tonic-gate 
88*7c478bd9Sstevel@tonic-gate void
89*7c478bd9Sstevel@tonic-gate db_set_current_interface(char const *p)
90*7c478bd9Sstevel@tonic-gate {
91*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_set_current_interface() {");
92*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Current_Interface, p,
93*7c478bd9Sstevel@tonic-gate 	    sizeof (Database.Current_Interface));
94*7c478bd9Sstevel@tonic-gate 	Database.Current_Interface[
95*7c478bd9Sstevel@tonic-gate 		sizeof (Database.Current_Interface) - 1] = '\0';
96*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
97*7c478bd9Sstevel@tonic-gate }
98*7c478bd9Sstevel@tonic-gate 
99*7c478bd9Sstevel@tonic-gate char *
100*7c478bd9Sstevel@tonic-gate db_get_current_interface(void)
101*7c478bd9Sstevel@tonic-gate {
102*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_get_current_interface() {"); errlog(END, "}");
103*7c478bd9Sstevel@tonic-gate 	return (Database.Current_Interface);
104*7c478bd9Sstevel@tonic-gate }
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate 
107*7c478bd9Sstevel@tonic-gate void
108*7c478bd9Sstevel@tonic-gate db_set_source_directory(char const *p)
109*7c478bd9Sstevel@tonic-gate {
110*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_set_source_directory() {");
111*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Source_Directory, p,
112*7c478bd9Sstevel@tonic-gate 	    sizeof (Database.Source_Directory));
113*7c478bd9Sstevel@tonic-gate 	Database.Source_Directory[sizeof (Database.Source_Directory) - 1] =
114*7c478bd9Sstevel@tonic-gate 	    '\0';
115*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
116*7c478bd9Sstevel@tonic-gate }
117*7c478bd9Sstevel@tonic-gate 
118*7c478bd9Sstevel@tonic-gate char *
119*7c478bd9Sstevel@tonic-gate db_get_source_directory(void)
120*7c478bd9Sstevel@tonic-gate {
121*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_get_source_directory() {"); errlog(END, "}");
122*7c478bd9Sstevel@tonic-gate 	return (Database.Source_Directory);
123*7c478bd9Sstevel@tonic-gate }
124*7c478bd9Sstevel@tonic-gate 
125*7c478bd9Sstevel@tonic-gate 
126*7c478bd9Sstevel@tonic-gate void
127*7c478bd9Sstevel@tonic-gate db_set_target_directory(char const *p)
128*7c478bd9Sstevel@tonic-gate {
129*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_set_target_directory() {");
130*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Target_Directory, p,
131*7c478bd9Sstevel@tonic-gate 	    sizeof (Database.Target_Directory));
132*7c478bd9Sstevel@tonic-gate 	Database.Target_Directory[sizeof (Database.Target_Directory) - 1] =
133*7c478bd9Sstevel@tonic-gate 	    '\0';
134*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
135*7c478bd9Sstevel@tonic-gate }
136*7c478bd9Sstevel@tonic-gate 
137*7c478bd9Sstevel@tonic-gate char *
138*7c478bd9Sstevel@tonic-gate db_get_target_directory(void)
139*7c478bd9Sstevel@tonic-gate {
140*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_get_target_directory() {"); errlog(END, "}");
141*7c478bd9Sstevel@tonic-gate 	return (Database.Target_Directory);
142*7c478bd9Sstevel@tonic-gate }
143*7c478bd9Sstevel@tonic-gate 
144*7c478bd9Sstevel@tonic-gate void
145*7c478bd9Sstevel@tonic-gate db_set_current_file(char const *p)
146*7c478bd9Sstevel@tonic-gate {
147*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Current_File, p,
148*7c478bd9Sstevel@tonic-gate 		sizeof (Database.Current_File));
149*7c478bd9Sstevel@tonic-gate 	Database.Current_File[sizeof (Database.Current_File) - 1] = '\0';
150*7c478bd9Sstevel@tonic-gate }
151*7c478bd9Sstevel@tonic-gate 
152*7c478bd9Sstevel@tonic-gate char *
153*7c478bd9Sstevel@tonic-gate db_get_current_file(void)
154*7c478bd9Sstevel@tonic-gate {
155*7c478bd9Sstevel@tonic-gate 	return (Database.Current_File);
156*7c478bd9Sstevel@tonic-gate }
157*7c478bd9Sstevel@tonic-gate 
158*7c478bd9Sstevel@tonic-gate 
159*7c478bd9Sstevel@tonic-gate /*
160*7c478bd9Sstevel@tonic-gate  * Output File -- set from either -o option or file name.
161*7c478bd9Sstevel@tonic-gate  */
162*7c478bd9Sstevel@tonic-gate void
163*7c478bd9Sstevel@tonic-gate db_set_output_file(char const *p)
164*7c478bd9Sstevel@tonic-gate {
165*7c478bd9Sstevel@tonic-gate 	char	*q;
166*7c478bd9Sstevel@tonic-gate 
167*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_set_output_file() {");
168*7c478bd9Sstevel@tonic-gate 	if (p == NULL) {
169*7c478bd9Sstevel@tonic-gate 		errlog(END, "}");
170*7c478bd9Sstevel@tonic-gate 		return;
171*7c478bd9Sstevel@tonic-gate 	}
172*7c478bd9Sstevel@tonic-gate 
173*7c478bd9Sstevel@tonic-gate 	(void) strncpy(Database.Output_File, p, sizeof (Database.Output_File));
174*7c478bd9Sstevel@tonic-gate 	if ((q = strrchr(Database.Output_File, '.')) != NULL) {
175*7c478bd9Sstevel@tonic-gate 		*q = '\0';
176*7c478bd9Sstevel@tonic-gate 	} else {
177*7c478bd9Sstevel@tonic-gate 		Database.Output_File[sizeof (Database.Output_File) - 1] = '\0';
178*7c478bd9Sstevel@tonic-gate 	}
179*7c478bd9Sstevel@tonic-gate 	errlog(VERBOSE, "output file = '%s'\n", Database.Output_File);
180*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
181*7c478bd9Sstevel@tonic-gate }
182*7c478bd9Sstevel@tonic-gate 
183*7c478bd9Sstevel@tonic-gate char *
184*7c478bd9Sstevel@tonic-gate db_get_output_file(void)
185*7c478bd9Sstevel@tonic-gate {
186*7c478bd9Sstevel@tonic-gate 	static char buffer[MAXLINE];
187*7c478bd9Sstevel@tonic-gate 	char	*p, *q;
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_get_output_file() {");
190*7c478bd9Sstevel@tonic-gate 	if (*Database.Output_File != NULL) {
191*7c478bd9Sstevel@tonic-gate 		/* It was set with the -o option */
192*7c478bd9Sstevel@tonic-gate 		errlog(VERBOSE, "output file from -o = '%s'\n",
193*7c478bd9Sstevel@tonic-gate 			Database.Output_File);
194*7c478bd9Sstevel@tonic-gate 		errlog(END, "}");
195*7c478bd9Sstevel@tonic-gate 		return (Database.Output_File);
196*7c478bd9Sstevel@tonic-gate 	} else {
197*7c478bd9Sstevel@tonic-gate 		/* We generate it from the current input file. */
198*7c478bd9Sstevel@tonic-gate 		(void) strncpy(buffer, Database.Current_File, sizeof (buffer));
199*7c478bd9Sstevel@tonic-gate 		p = basename(buffer);
200*7c478bd9Sstevel@tonic-gate 		if ((q = strrchr(p, '.')) != NULL) {
201*7c478bd9Sstevel@tonic-gate 			*q = '\0';
202*7c478bd9Sstevel@tonic-gate 		}
203*7c478bd9Sstevel@tonic-gate 		errlog(VERBOSE, "output file from input = '%s'\n", p);
204*7c478bd9Sstevel@tonic-gate 		errlog(END, "}");
205*7c478bd9Sstevel@tonic-gate 		return (p);
206*7c478bd9Sstevel@tonic-gate 	}
207*7c478bd9Sstevel@tonic-gate }
208*7c478bd9Sstevel@tonic-gate 
209*7c478bd9Sstevel@tonic-gate /*
210*7c478bd9Sstevel@tonic-gate  * Manually written table code.
211*7c478bd9Sstevel@tonic-gate  */
212*7c478bd9Sstevel@tonic-gate 
213*7c478bd9Sstevel@tonic-gate /*
214*7c478bd9Sstevel@tonic-gate  * add_print_types -- add legal print types.  Check for void
215*7c478bd9Sstevel@tonic-gate  *	moved here out of collect, as collect isn't good enough
216*7c478bd9Sstevel@tonic-gate  *	quality of parser to have a single code path for
217*7c478bd9Sstevel@tonic-gate  *	types. (Shudder)  Subsequently changed to use special-purpose
218*7c478bd9Sstevel@tonic-gate  *	test for membership.  Also shudder!
219*7c478bd9Sstevel@tonic-gate  */
220*7c478bd9Sstevel@tonic-gate 
221*7c478bd9Sstevel@tonic-gate void
222*7c478bd9Sstevel@tonic-gate db_add_print_types(char *print_type, char *c_type)
223*7c478bd9Sstevel@tonic-gate {
224*7c478bd9Sstevel@tonic-gate 	char    buffer[MAXLINE];
225*7c478bd9Sstevel@tonic-gate 
226*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_add_print_types() {");
227*7c478bd9Sstevel@tonic-gate 
228*7c478bd9Sstevel@tonic-gate 	(void) snprintf(buffer, sizeof (buffer), "%s, %s", print_type, c_type);
229*7c478bd9Sstevel@tonic-gate 	if (Database.Print_Types == NULL) {
230*7c478bd9Sstevel@tonic-gate 		Database.Print_Types = create_string_table(50);
231*7c478bd9Sstevel@tonic-gate 	}
232*7c478bd9Sstevel@tonic-gate 	if (in_string_table(Database.Print_Types, print_type) == NO) {
233*7c478bd9Sstevel@tonic-gate 		Database.Print_Types = add_string_table(Database.Print_Types,
234*7c478bd9Sstevel@tonic-gate 		    &buffer[0]);
235*7c478bd9Sstevel@tonic-gate 	}
236*7c478bd9Sstevel@tonic-gate 
237*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
238*7c478bd9Sstevel@tonic-gate }
239*7c478bd9Sstevel@tonic-gate 
240*7c478bd9Sstevel@tonic-gate char *
241*7c478bd9Sstevel@tonic-gate db_get_first_print_type(void)
242*7c478bd9Sstevel@tonic-gate {
243*7c478bd9Sstevel@tonic-gate 	curr_print_type = 1;
244*7c478bd9Sstevel@tonic-gate 	return (get_string_table(Database.Print_Types, 0));
245*7c478bd9Sstevel@tonic-gate }
246*7c478bd9Sstevel@tonic-gate 
247*7c478bd9Sstevel@tonic-gate char *
248*7c478bd9Sstevel@tonic-gate db_get_next_print_type(void)
249*7c478bd9Sstevel@tonic-gate {
250*7c478bd9Sstevel@tonic-gate 
251*7c478bd9Sstevel@tonic-gate 	return (get_string_table(Database.Print_Types, curr_print_type++));
252*7c478bd9Sstevel@tonic-gate }
253*7c478bd9Sstevel@tonic-gate 
254*7c478bd9Sstevel@tonic-gate 
255*7c478bd9Sstevel@tonic-gate void
256*7c478bd9Sstevel@tonic-gate db_sort_print_types(void)
257*7c478bd9Sstevel@tonic-gate {
258*7c478bd9Sstevel@tonic-gate 	errlog(BEGIN, "db_sort_print_types() {");
259*7c478bd9Sstevel@tonic-gate 	sort_string_table(Database.Print_Types);
260*7c478bd9Sstevel@tonic-gate 	errlog(END, "}");
261*7c478bd9Sstevel@tonic-gate }
262*7c478bd9Sstevel@tonic-gate 
263*7c478bd9Sstevel@tonic-gate void
264*7c478bd9Sstevel@tonic-gate db_set_arch(char const *arch)
265*7c478bd9Sstevel@tonic-gate {
266*7c478bd9Sstevel@tonic-gate 	Database.Arch = arch;
267*7c478bd9Sstevel@tonic-gate }
268*7c478bd9Sstevel@tonic-gate 
269*7c478bd9Sstevel@tonic-gate char const *
270*7c478bd9Sstevel@tonic-gate db_get_arch(void)
271*7c478bd9Sstevel@tonic-gate {
272*7c478bd9Sstevel@tonic-gate 	return (Database.Arch);
273*7c478bd9Sstevel@tonic-gate }
274