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