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