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