1753d2d2eSraf /*
2753d2d2eSraf  * CDDL HEADER START
3753d2d2eSraf  *
4753d2d2eSraf  * The contents of this file are subject to the terms of the
5753d2d2eSraf  * Common Development and Distribution License, Version 1.0 only
6753d2d2eSraf  * (the "License").  You may not use this file except in compliance
7753d2d2eSraf  * with the License.
8753d2d2eSraf  *
9753d2d2eSraf  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10753d2d2eSraf  * or http://www.opensolaris.org/os/licensing.
11753d2d2eSraf  * See the License for the specific language governing permissions
12753d2d2eSraf  * and limitations under the License.
13753d2d2eSraf  *
14753d2d2eSraf  * When distributing Covered Code, include this CDDL HEADER in each
15753d2d2eSraf  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16753d2d2eSraf  * If applicable, add the following below this CDDL HEADER, with the
17753d2d2eSraf  * fields enclosed by brackets "[]" replaced with your own identifying
18753d2d2eSraf  * information: Portions Copyright [yyyy] [name of copyright owner]
19753d2d2eSraf  *
20753d2d2eSraf  * CDDL HEADER END
21753d2d2eSraf  */
22753d2d2eSraf /*
23753d2d2eSraf  * Copyright (c) 1997-1999 by Sun Microsystems, Inc.
24753d2d2eSraf  * All rights reserved.
25753d2d2eSraf  */
26753d2d2eSraf 
27753d2d2eSraf /*
28753d2d2eSraf  * db.c -- the tiny database for trace.  Only stores
29753d2d2eSraf  *	global things: see symtab for per-function data.
30753d2d2eSraf  *
31753d2d2eSraf  */
32753d2d2eSraf 
33753d2d2eSraf #include <stdio.h>
34753d2d2eSraf #include <string.h>
35753d2d2eSraf #include <libgen.h>
36753d2d2eSraf #include <limits.h>
37753d2d2eSraf #include <sys/param.h>
38753d2d2eSraf #include "parser.h"
39753d2d2eSraf #include "trace.h"
40753d2d2eSraf #include "util.h"
41753d2d2eSraf #include "errlog.h"
42753d2d2eSraf #include "db.h"
43753d2d2eSraf 
44753d2d2eSraf static int curr_print_type;
45753d2d2eSraf 
46753d2d2eSraf static struct {
47753d2d2eSraf 	char	Current_Library[PATH_MAX];
48753d2d2eSraf 	char	Current_File[PATH_MAX];
49753d2d2eSraf 	char	Output_File[PATH_MAX];
50753d2d2eSraf 	char	Current_Interface[PATH_MAX];
51753d2d2eSraf 	char	Source_Directory[PATH_MAX];
52753d2d2eSraf 	char	Target_Directory[PATH_MAX];
53753d2d2eSraf 	int	NFiles;
54753d2d2eSraf 	int	Verbosity;
55753d2d2eSraf 	char	Library_List[PATH_MAX];
56753d2d2eSraf 	char	Translator[MAXNAMELEN];
57753d2d2eSraf 	char	Test_Type[MAXNAMELEN];
58753d2d2eSraf 	char	Kludge[PATH_MAX];
59753d2d2eSraf 	int	Flags;
60753d2d2eSraf 	char const *Arch;
61753d2d2eSraf 	table_t	*Print_Types;
62753d2d2eSraf 	table_t	*File;
63753d2d2eSraf 	table_t	*Exclusions;
64753d2d2eSraf 
65753d2d2eSraf } Database;
66753d2d2eSraf 
67753d2d2eSraf 
68753d2d2eSraf /* Generated by m4 -- character string values */
69753d2d2eSraf void
db_set_current_library(char const * p)70753d2d2eSraf db_set_current_library(char const *p)
71753d2d2eSraf {
72753d2d2eSraf 	errlog(BEGIN, "db_set_current_library() {");
73753d2d2eSraf 	(void) strncpy(Database.Current_Library, p,
74753d2d2eSraf 	    sizeof (Database.Current_Library));
75*07c94cbfSToomas Soome 	Database.Current_Library[sizeof (Database.Current_Library) - 1] = '\0';
76753d2d2eSraf 	errlog(END, "}");
77753d2d2eSraf }
78753d2d2eSraf 
79753d2d2eSraf char *
db_get_current_library(void)80753d2d2eSraf db_get_current_library(void)
81753d2d2eSraf {
82753d2d2eSraf 	errlog(BEGIN, "db_get_current_library() {"); errlog(END, "}");
83753d2d2eSraf 	return (Database.Current_Library);
84753d2d2eSraf }
85753d2d2eSraf 
86753d2d2eSraf void
db_set_current_interface(char const * p)87753d2d2eSraf db_set_current_interface(char const *p)
88753d2d2eSraf {
89753d2d2eSraf 	errlog(BEGIN, "db_set_current_interface() {");
90753d2d2eSraf 	(void) strncpy(Database.Current_Interface, p,
91753d2d2eSraf 	    sizeof (Database.Current_Interface));
92753d2d2eSraf 	Database.Current_Interface[
93753d2d2eSraf 		sizeof (Database.Current_Interface) - 1] = '\0';
94753d2d2eSraf 	errlog(END, "}");
95753d2d2eSraf }
96753d2d2eSraf 
97753d2d2eSraf char *
db_get_current_interface(void)98753d2d2eSraf db_get_current_interface(void)
99753d2d2eSraf {
100753d2d2eSraf 	errlog(BEGIN, "db_get_current_interface() {"); errlog(END, "}");
101753d2d2eSraf 	return (Database.Current_Interface);
102753d2d2eSraf }
103753d2d2eSraf 
104753d2d2eSraf 
105753d2d2eSraf void
db_set_source_directory(char const * p)106753d2d2eSraf db_set_source_directory(char const *p)
107753d2d2eSraf {
108753d2d2eSraf 	errlog(BEGIN, "db_set_source_directory() {");
109753d2d2eSraf 	(void) strncpy(Database.Source_Directory, p,
110753d2d2eSraf 	    sizeof (Database.Source_Directory));
111753d2d2eSraf 	Database.Source_Directory[sizeof (Database.Source_Directory) - 1] =
112753d2d2eSraf 	    '\0';
113753d2d2eSraf 	errlog(END, "}");
114753d2d2eSraf }
115753d2d2eSraf 
116753d2d2eSraf char *
db_get_source_directory(void)117753d2d2eSraf db_get_source_directory(void)
118753d2d2eSraf {
119753d2d2eSraf 	errlog(BEGIN, "db_get_source_directory() {"); errlog(END, "}");
120753d2d2eSraf 	return (Database.Source_Directory);
121753d2d2eSraf }
122753d2d2eSraf 
123753d2d2eSraf 
124753d2d2eSraf void
db_set_target_directory(char const * p)125753d2d2eSraf db_set_target_directory(char const *p)
126753d2d2eSraf {
127753d2d2eSraf 	errlog(BEGIN, "db_set_target_directory() {");
128753d2d2eSraf 	(void) strncpy(Database.Target_Directory, p,
129753d2d2eSraf 	    sizeof (Database.Target_Directory));
130753d2d2eSraf 	Database.Target_Directory[sizeof (Database.Target_Directory) - 1] =
131753d2d2eSraf 	    '\0';
132753d2d2eSraf 	errlog(END, "}");
133753d2d2eSraf }
134753d2d2eSraf 
135753d2d2eSraf char *
db_get_target_directory(void)136753d2d2eSraf db_get_target_directory(void)
137753d2d2eSraf {
138753d2d2eSraf 	errlog(BEGIN, "db_get_target_directory() {"); errlog(END, "}");
139753d2d2eSraf 	return (Database.Target_Directory);
140753d2d2eSraf }
141753d2d2eSraf 
142753d2d2eSraf void
db_set_current_file(char const * p)143753d2d2eSraf db_set_current_file(char const *p)
144753d2d2eSraf {
145753d2d2eSraf 	(void) strncpy(Database.Current_File, p,
146753d2d2eSraf 		sizeof (Database.Current_File));
147753d2d2eSraf 	Database.Current_File[sizeof (Database.Current_File) - 1] = '\0';
148753d2d2eSraf }
149753d2d2eSraf 
150753d2d2eSraf char *
db_get_current_file(void)151753d2d2eSraf db_get_current_file(void)
152753d2d2eSraf {
153753d2d2eSraf 	return (Database.Current_File);
154753d2d2eSraf }
155753d2d2eSraf 
156753d2d2eSraf 
157753d2d2eSraf /*
158753d2d2eSraf  * Output File -- set from either -o option or file name.
159753d2d2eSraf  */
160753d2d2eSraf void
db_set_output_file(char const * p)161753d2d2eSraf db_set_output_file(char const *p)
162753d2d2eSraf {
163753d2d2eSraf 	char	*q;
164753d2d2eSraf 
165753d2d2eSraf 	errlog(BEGIN, "db_set_output_file() {");
166753d2d2eSraf 	if (p == NULL) {
167753d2d2eSraf 		errlog(END, "}");
168753d2d2eSraf 		return;
169753d2d2eSraf 	}
170753d2d2eSraf 
171753d2d2eSraf 	(void) strncpy(Database.Output_File, p, sizeof (Database.Output_File));
172753d2d2eSraf 	if ((q = strrchr(Database.Output_File, '.')) != NULL) {
173753d2d2eSraf 		*q = '\0';
174753d2d2eSraf 	} else {
175753d2d2eSraf 		Database.Output_File[sizeof (Database.Output_File) - 1] = '\0';
176753d2d2eSraf 	}
177753d2d2eSraf 	errlog(VERBOSE, "output file = '%s'\n", Database.Output_File);
178753d2d2eSraf 	errlog(END, "}");
179753d2d2eSraf }
180753d2d2eSraf 
181753d2d2eSraf char *
db_get_output_file(void)182753d2d2eSraf db_get_output_file(void)
183753d2d2eSraf {
184753d2d2eSraf 	static char buffer[MAXLINE];
185753d2d2eSraf 	char	*p, *q;
186753d2d2eSraf 
187753d2d2eSraf 	errlog(BEGIN, "db_get_output_file() {");
188*07c94cbfSToomas Soome 	if (*Database.Output_File != '\0') {
189753d2d2eSraf 		/* It was set with the -o option */
190753d2d2eSraf 		errlog(VERBOSE, "output file from -o = '%s'\n",
191753d2d2eSraf 			Database.Output_File);
192753d2d2eSraf 		errlog(END, "}");
193753d2d2eSraf 		return (Database.Output_File);
194753d2d2eSraf 	} else {
195753d2d2eSraf 		/* We generate it from the current input file. */
196753d2d2eSraf 		(void) strncpy(buffer, Database.Current_File, sizeof (buffer));
197753d2d2eSraf 		p = basename(buffer);
198753d2d2eSraf 		if ((q = strrchr(p, '.')) != NULL) {
199753d2d2eSraf 			*q = '\0';
200753d2d2eSraf 		}
201753d2d2eSraf 		errlog(VERBOSE, "output file from input = '%s'\n", p);
202753d2d2eSraf 		errlog(END, "}");
203753d2d2eSraf 		return (p);
204753d2d2eSraf 	}
205753d2d2eSraf }
206753d2d2eSraf 
207753d2d2eSraf /*
208753d2d2eSraf  * Manually written table code.
209753d2d2eSraf  */
210753d2d2eSraf 
211753d2d2eSraf /*
212753d2d2eSraf  * add_print_types -- add legal print types.  Check for void
213753d2d2eSraf  *	moved here out of collect, as collect isn't good enough
214753d2d2eSraf  *	quality of parser to have a single code path for
215753d2d2eSraf  *	types. (Shudder)  Subsequently changed to use special-purpose
216753d2d2eSraf  *	test for membership.  Also shudder!
217753d2d2eSraf  */
218753d2d2eSraf 
219753d2d2eSraf void
db_add_print_types(char * print_type,char * c_type)220753d2d2eSraf db_add_print_types(char *print_type, char *c_type)
221753d2d2eSraf {
222753d2d2eSraf 	char    buffer[MAXLINE];
223753d2d2eSraf 
224753d2d2eSraf 	errlog(BEGIN, "db_add_print_types() {");
225753d2d2eSraf 
226753d2d2eSraf 	(void) snprintf(buffer, sizeof (buffer), "%s, %s", print_type, c_type);
227753d2d2eSraf 	if (Database.Print_Types == NULL) {
228753d2d2eSraf 		Database.Print_Types = create_string_table(50);
229753d2d2eSraf 	}
230753d2d2eSraf 	if (in_string_table(Database.Print_Types, print_type) == NO) {
231753d2d2eSraf 		Database.Print_Types = add_string_table(Database.Print_Types,
232753d2d2eSraf 		    &buffer[0]);
233753d2d2eSraf 	}
234753d2d2eSraf 
235753d2d2eSraf 	errlog(END, "}");
236753d2d2eSraf }
237753d2d2eSraf 
238753d2d2eSraf char *
db_get_first_print_type(void)239753d2d2eSraf db_get_first_print_type(void)
240753d2d2eSraf {
241753d2d2eSraf 	curr_print_type = 1;
242753d2d2eSraf 	return (get_string_table(Database.Print_Types, 0));
243753d2d2eSraf }
244753d2d2eSraf 
245753d2d2eSraf char *
db_get_next_print_type(void)246753d2d2eSraf db_get_next_print_type(void)
247753d2d2eSraf {
248753d2d2eSraf 
249753d2d2eSraf 	return (get_string_table(Database.Print_Types, curr_print_type++));
250753d2d2eSraf }
251753d2d2eSraf 
252753d2d2eSraf 
253753d2d2eSraf void
db_sort_print_types(void)254753d2d2eSraf db_sort_print_types(void)
255753d2d2eSraf {
256753d2d2eSraf 	errlog(BEGIN, "db_sort_print_types() {");
257753d2d2eSraf 	sort_string_table(Database.Print_Types);
258753d2d2eSraf 	errlog(END, "}");
259753d2d2eSraf }
260753d2d2eSraf 
261753d2d2eSraf void
db_set_arch(char const * arch)262753d2d2eSraf db_set_arch(char const *arch)
263753d2d2eSraf {
264753d2d2eSraf 	Database.Arch = arch;
265753d2d2eSraf }
266753d2d2eSraf 
267753d2d2eSraf char const *
db_get_arch(void)268753d2d2eSraf db_get_arch(void)
269753d2d2eSraf {
270753d2d2eSraf 	return (Database.Arch);
271753d2d2eSraf }
272