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