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
db_set_current_library(char const * p)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 *
db_get_current_library(void)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
db_set_current_interface(char const * p)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 *
db_get_current_interface(void)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
db_set_source_directory(char const * p)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 *
db_get_source_directory(void)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
db_set_target_directory(char const * p)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 *
db_get_target_directory(void)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
db_set_current_file(char const * p)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 *
db_get_current_file(void)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
db_set_output_file(char const * p)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 *
db_get_output_file(void)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
db_add_print_types(char * print_type,char * c_type)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 *
db_get_first_print_type(void)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 *
db_get_next_print_type(void)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
db_sort_print_types(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
db_set_arch(char const * arch)264*753d2d2eSraf db_set_arch(char const *arch)
265*753d2d2eSraf {
266*753d2d2eSraf Database.Arch = arch;
267*753d2d2eSraf }
268*753d2d2eSraf
269*753d2d2eSraf char const *
db_get_arch(void)270*753d2d2eSraf db_get_arch(void)
271*753d2d2eSraf {
272*753d2d2eSraf return (Database.Arch);
273*753d2d2eSraf }
274