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 #include <stdio.h> 30*753d2d2eSraf #include <string.h> 31*753d2d2eSraf #include <limits.h> 32*753d2d2eSraf #include <malloc.h> 33*753d2d2eSraf #include "parser.h" 34*753d2d2eSraf #include "trace.h" 35*753d2d2eSraf #include "util.h" 36*753d2d2eSraf #include "symtab.h" 37*753d2d2eSraf #include "errlog.h" 38*753d2d2eSraf 39*753d2d2eSraf /* Types */ 40*753d2d2eSraf enum kind_t { PRIMITIVE = 0, COMPOSITE, VARARG }; 41*753d2d2eSraf 42*753d2d2eSraf struct entry_t { 43*753d2d2eSraf char *e_name; 44*753d2d2eSraf int e_valid; 45*753d2d2eSraf int e_line; 46*753d2d2eSraf char *e_file; 47*753d2d2eSraf int e_kind; /* PRIMITIVE, COMPOSITE... */ 48*753d2d2eSraf char *e_type; /* where kind == PRIMITIVE */ 49*753d2d2eSraf /* base type, ie. char if e_type is char */ 50*753d2d2eSraf char *e_basetype; 51*753d2d2eSraf int e_levels; /* levels of indirection */ 52*753d2d2eSraf char *e_attribute; /* kind == COMPOSITE or VARARG. */ 53*753d2d2eSraf char *e_assertion; /* reserved for kind == VARARG. */ 54*753d2d2eSraf char *e_comment; /* reserved for per-element comments. */ 55*753d2d2eSraf int e_pre_uses; 56*753d2d2eSraf int e_post_uses; 57*753d2d2eSraf }; 58*753d2d2eSraf 59*753d2d2eSraf typedef struct entry_head_t { 60*753d2d2eSraf int used; 61*753d2d2eSraf int n_entries; 62*753d2d2eSraf ENTRY entry[1]; /* Actually entry[n_entries]. */ 63*753d2d2eSraf } EHEAD; 64*753d2d2eSraf 65*753d2d2eSraf static struct symtab_t { 66*753d2d2eSraf ENTRY *Function; 67*753d2d2eSraf EHEAD *Args; 68*753d2d2eSraf EHEAD *Varargs; 69*753d2d2eSraf EHEAD *Globals; 70*753d2d2eSraf ENTRY *Errval; 71*753d2d2eSraf 72*753d2d2eSraf /* Includes */ 73*753d2d2eSraf table_t *Includes; 74*753d2d2eSraf 75*753d2d2eSraf /* Bindings */ 76*753d2d2eSraf ENTRY *Exception; 77*753d2d2eSraf 78*753d2d2eSraf /* Types */ 79*753d2d2eSraf table_t *Print_Types; 80*753d2d2eSraf 81*753d2d2eSraf /* Error-message information. */ 82*753d2d2eSraf int Line; 83*753d2d2eSraf char Filename[MAXLINE]; 84*753d2d2eSraf 85*753d2d2eSraf /* Trace additions */ 86*753d2d2eSraf char Prototype[MAXLINE]; 87*753d2d2eSraf char Formals[MAXLINE]; 88*753d2d2eSraf char Actuals[MAXLINE]; 89*753d2d2eSraf char Cast[MAXLINE]; 90*753d2d2eSraf int Nonreturn; 91*753d2d2eSraf int Skip; 92*753d2d2eSraf 93*753d2d2eSraf /* Adl additions */ 94*753d2d2eSraf /* various assertions, one hopes */ 95*753d2d2eSraf } Symtab; 96*753d2d2eSraf 97*753d2d2eSraf /* File Globals. */ 98*753d2d2eSraf static EHEAD *create_entry_table(int); 99*753d2d2eSraf static EHEAD *add_entry_table(EHEAD *, 100*753d2d2eSraf char *, int, char *, int, char *, char *, int, char *, int, int); 101*753d2d2eSraf static ENTRY *get_entry_table(EHEAD *, int); 102*753d2d2eSraf static EHEAD *free_entry_table(EHEAD *); 103*753d2d2eSraf static void clear_entries(EHEAD *, int, int); 104*753d2d2eSraf static ENTRY *allocate_entry(ENTRY *, char *, int, char *, int, 105*753d2d2eSraf char *, char *, int, char *, int, int); 106*753d2d2eSraf static ENTRY *set_entry(ENTRY *, 107*753d2d2eSraf char *, int, char *, int, char *, char *, int, char *, int, int); 108*753d2d2eSraf static ENTRY *free_entry(ENTRY *); 109*753d2d2eSraf static void symtab_clear_varargs(void); 110*753d2d2eSraf static void symtab_clear_globals(void); 111*753d2d2eSraf static void symtab_clear_print_types(void); 112*753d2d2eSraf static void symtab_set_nonreturn(int); 113*753d2d2eSraf static table_t *symtab_free_print_types(table_t *); 114*753d2d2eSraf 115*753d2d2eSraf /* 116*753d2d2eSraf * symtab_new_function -- clear counts, variables for a new function. 117*753d2d2eSraf */ 118*753d2d2eSraf void 119*753d2d2eSraf symtab_new_function(const int line, const char *file) 120*753d2d2eSraf { 121*753d2d2eSraf errlog(BEGIN, "symtab_new_function() {"); 122*753d2d2eSraf Symtab.Line = line; /* Set, don't clear. */ 123*753d2d2eSraf symtab_set_filename(file); 124*753d2d2eSraf 125*753d2d2eSraf symtab_clear_function(); 126*753d2d2eSraf symtab_clear_varargs(); 127*753d2d2eSraf symtab_clear_globals(); 128*753d2d2eSraf symtab_clear_errval(); 129*753d2d2eSraf symtab_clear_exception(); 130*753d2d2eSraf symtab_clear_print_types(); 131*753d2d2eSraf 132*753d2d2eSraf symtab_set_nonreturn(NO); 133*753d2d2eSraf symtab_set_skip(NO); 134*753d2d2eSraf errlog(END, "}"); 135*753d2d2eSraf } 136*753d2d2eSraf 137*753d2d2eSraf 138*753d2d2eSraf /* 139*753d2d2eSraf * symtab_clear_function -- clear function-prototype-derived 140*753d2d2eSraf * values. Called on each prototype line and at beginning 141*753d2d2eSraf * of interface. 142*753d2d2eSraf */ 143*753d2d2eSraf void 144*753d2d2eSraf symtab_clear_function(void) 145*753d2d2eSraf { 146*753d2d2eSraf 147*753d2d2eSraf errlog(BEGIN, "symtab_clear_function() {"); 148*753d2d2eSraf Symtab.Function = free_entry(Symtab.Function); 149*753d2d2eSraf Symtab.Args = free_entry_table(Symtab.Args); 150*753d2d2eSraf Symtab.Prototype[0] = NULL; 151*753d2d2eSraf Symtab.Formals[0] = NULL; 152*753d2d2eSraf Symtab.Actuals[0] = NULL; 153*753d2d2eSraf Symtab.Cast[0] = NULL; 154*753d2d2eSraf errlog(END, "}"); 155*753d2d2eSraf } 156*753d2d2eSraf 157*753d2d2eSraf 158*753d2d2eSraf /* 159*753d2d2eSraf * symtab_clear_varargs -- called only at end 160*753d2d2eSraf */ 161*753d2d2eSraf static void 162*753d2d2eSraf symtab_clear_varargs(void) 163*753d2d2eSraf { 164*753d2d2eSraf 165*753d2d2eSraf errlog(BEGIN, "symtab_clear_varargs() {"); 166*753d2d2eSraf Symtab.Varargs = free_entry_table(Symtab.Varargs); 167*753d2d2eSraf errlog(END, "}"); 168*753d2d2eSraf } 169*753d2d2eSraf 170*753d2d2eSraf /* 171*753d2d2eSraf * symtab_clear_includes -- clear only at end of file (union++) 172*753d2d2eSraf */ 173*753d2d2eSraf void 174*753d2d2eSraf symtab_clear_includes(void) 175*753d2d2eSraf { 176*753d2d2eSraf 177*753d2d2eSraf errlog(BEGIN, "symtab_clear_includes() {"); 178*753d2d2eSraf Symtab.Includes = free_string_table(Symtab.Includes); 179*753d2d2eSraf errlog(END, "}"); 180*753d2d2eSraf } 181*753d2d2eSraf 182*753d2d2eSraf static void 183*753d2d2eSraf symtab_clear_globals(void) 184*753d2d2eSraf { 185*753d2d2eSraf 186*753d2d2eSraf errlog(BEGIN, "symtab_clear_globals() {"); 187*753d2d2eSraf Symtab.Globals = free_entry_table(Symtab.Globals); 188*753d2d2eSraf errlog(END, "}"); 189*753d2d2eSraf } 190*753d2d2eSraf 191*753d2d2eSraf void 192*753d2d2eSraf symtab_clear_errval(void) 193*753d2d2eSraf { 194*753d2d2eSraf 195*753d2d2eSraf errlog(BEGIN, "symtab_clear_errval() {"); 196*753d2d2eSraf Symtab.Errval = free_entry(Symtab.Errval); 197*753d2d2eSraf errlog(END, "}"); 198*753d2d2eSraf } 199*753d2d2eSraf 200*753d2d2eSraf void 201*753d2d2eSraf symtab_clear_exception(void) 202*753d2d2eSraf { 203*753d2d2eSraf 204*753d2d2eSraf errlog(BEGIN, "symtab_clear_exception() {"); 205*753d2d2eSraf Symtab.Exception = free_entry(Symtab.Exception); 206*753d2d2eSraf errlog(END, "}"); 207*753d2d2eSraf } 208*753d2d2eSraf 209*753d2d2eSraf static void 210*753d2d2eSraf symtab_clear_print_types(void) 211*753d2d2eSraf { 212*753d2d2eSraf 213*753d2d2eSraf errlog(BEGIN, "symtab_clear_print_types() {"); 214*753d2d2eSraf Symtab.Print_Types = symtab_free_print_types(Symtab.Print_Types); 215*753d2d2eSraf errlog(END, "}"); 216*753d2d2eSraf } 217*753d2d2eSraf 218*753d2d2eSraf 219*753d2d2eSraf /* Generated by m4 -- character string values */ 220*753d2d2eSraf 221*753d2d2eSraf void 222*753d2d2eSraf symtab_set_prototype(char *p) 223*753d2d2eSraf { 224*753d2d2eSraf 225*753d2d2eSraf errlog(BEGIN, "symtab_set_prototype(void) {"); 226*753d2d2eSraf (void) strncpy(Symtab.Prototype, p, sizeof (Symtab.Prototype)); 227*753d2d2eSraf Symtab.Prototype[sizeof (Symtab.Prototype)-1] = NULL; 228*753d2d2eSraf errlog(END, "}"); 229*753d2d2eSraf } 230*753d2d2eSraf 231*753d2d2eSraf char * 232*753d2d2eSraf symtab_get_prototype(void) 233*753d2d2eSraf { 234*753d2d2eSraf errlog(BEGIN, "symtab_get_prototype() {"); errlog(END, "}"); 235*753d2d2eSraf return (Symtab.Prototype); 236*753d2d2eSraf } 237*753d2d2eSraf 238*753d2d2eSraf void 239*753d2d2eSraf symtab_set_formals(char *p) 240*753d2d2eSraf { 241*753d2d2eSraf errlog(BEGIN, "symtab_set_formals() {"); 242*753d2d2eSraf errlog(VERBOSE, "p = %s", p); 243*753d2d2eSraf (void) strncpy(Symtab.Formals, p, sizeof (Symtab.Formals)); 244*753d2d2eSraf Symtab.Formals[sizeof (Symtab.Formals)-1] = NULL; 245*753d2d2eSraf errlog(END, "}"); 246*753d2d2eSraf } 247*753d2d2eSraf 248*753d2d2eSraf char * 249*753d2d2eSraf symtab_get_formals(void) 250*753d2d2eSraf { 251*753d2d2eSraf errlog(BEGIN, "symtab_get_formals() {"); errlog(END, "}"); 252*753d2d2eSraf return (Symtab.Formals); 253*753d2d2eSraf } 254*753d2d2eSraf 255*753d2d2eSraf void 256*753d2d2eSraf symtab_set_actuals(char *p) 257*753d2d2eSraf { 258*753d2d2eSraf errlog(BEGIN, "symtab_set_actuals() {"); errlog(END, "}"); 259*753d2d2eSraf errlog(VERBOSE, "p = %s", p); 260*753d2d2eSraf (void) strncpy(Symtab.Actuals, p, sizeof (Symtab.Actuals)); 261*753d2d2eSraf Symtab.Actuals[sizeof (Symtab.Actuals)-1] = NULL; 262*753d2d2eSraf } 263*753d2d2eSraf 264*753d2d2eSraf char * 265*753d2d2eSraf symtab_get_actuals(void) 266*753d2d2eSraf { 267*753d2d2eSraf errlog(BEGIN, "symtab_get_actuals() {"); errlog(END, "}"); 268*753d2d2eSraf return (Symtab.Actuals); 269*753d2d2eSraf } 270*753d2d2eSraf 271*753d2d2eSraf void 272*753d2d2eSraf symtab_set_cast(char *p) 273*753d2d2eSraf { 274*753d2d2eSraf errlog(BEGIN, "symtab_set_cast() {"); errlog(END, "}"); 275*753d2d2eSraf (void) strncpy(Symtab.Cast, p, sizeof (Symtab.Cast)); 276*753d2d2eSraf Symtab.Cast[sizeof (Symtab.Cast)-1] = NULL; 277*753d2d2eSraf } 278*753d2d2eSraf 279*753d2d2eSraf char * 280*753d2d2eSraf symtab_get_cast(void) 281*753d2d2eSraf { 282*753d2d2eSraf errlog(BEGIN, "symtab_get_cast() {"); errlog(END, "}"); 283*753d2d2eSraf return (Symtab.Cast); 284*753d2d2eSraf } 285*753d2d2eSraf 286*753d2d2eSraf 287*753d2d2eSraf void 288*753d2d2eSraf symtab_set_filename(const char *p) 289*753d2d2eSraf { 290*753d2d2eSraf errlog(BEGIN, "symtab_set_filename() {"); errlog(END, "}"); 291*753d2d2eSraf (void) strncpy(Symtab.Filename, p, sizeof (Symtab.Filename)); 292*753d2d2eSraf Symtab.Filename[sizeof (Symtab.Filename)-1] = NULL; 293*753d2d2eSraf } 294*753d2d2eSraf 295*753d2d2eSraf char * 296*753d2d2eSraf symtab_get_filename(void) 297*753d2d2eSraf { 298*753d2d2eSraf errlog(BEGIN, "symtab_get_filename() {"); errlog(END, "}"); 299*753d2d2eSraf return (Symtab.Filename); 300*753d2d2eSraf } 301*753d2d2eSraf 302*753d2d2eSraf 303*753d2d2eSraf /* Generated by m4 -- int values */ 304*753d2d2eSraf 305*753d2d2eSraf static void 306*753d2d2eSraf symtab_set_nonreturn(int val) 307*753d2d2eSraf { 308*753d2d2eSraf errlog(BEGIN, "symtab_set_nonreturn() {"); errlog(END, "}"); 309*753d2d2eSraf Symtab.Nonreturn = val; 310*753d2d2eSraf } 311*753d2d2eSraf 312*753d2d2eSraf int 313*753d2d2eSraf symtab_get_nonreturn(void) 314*753d2d2eSraf { 315*753d2d2eSraf errlog(BEGIN, "symtab_get_nonreturn() {"); errlog(END, "}"); 316*753d2d2eSraf return (Symtab.Nonreturn); 317*753d2d2eSraf } 318*753d2d2eSraf 319*753d2d2eSraf void 320*753d2d2eSraf symtab_set_line(int val) 321*753d2d2eSraf { 322*753d2d2eSraf errlog(BEGIN, "symtab_set_line() {"); errlog(END, "}"); 323*753d2d2eSraf Symtab.Line = val; 324*753d2d2eSraf } 325*753d2d2eSraf 326*753d2d2eSraf int 327*753d2d2eSraf symtab_get_line(void) 328*753d2d2eSraf { 329*753d2d2eSraf errlog(BEGIN, "symtab_get_line() {"); errlog(END, "}"); 330*753d2d2eSraf return (Symtab.Line); 331*753d2d2eSraf } 332*753d2d2eSraf 333*753d2d2eSraf 334*753d2d2eSraf void 335*753d2d2eSraf symtab_set_skip(int value) 336*753d2d2eSraf { 337*753d2d2eSraf errlog(BEGIN, "symtab_set_skip() {"); errlog(END, "}"); 338*753d2d2eSraf Symtab.Skip = value; 339*753d2d2eSraf } 340*753d2d2eSraf 341*753d2d2eSraf int 342*753d2d2eSraf symtab_get_skip(void) 343*753d2d2eSraf { 344*753d2d2eSraf errlog(BEGIN, "symtab_get_skip() {"); errlog(END, "}"); 345*753d2d2eSraf return (Symtab.Skip); 346*753d2d2eSraf } 347*753d2d2eSraf 348*753d2d2eSraf /* 349*753d2d2eSraf * Manually written access functions for ENTRY * variables. 350*753d2d2eSraf */ 351*753d2d2eSraf 352*753d2d2eSraf void 353*753d2d2eSraf symtab_set_function(char *name, int line, char *file, 354*753d2d2eSraf char *type, char *basetype, int levels) 355*753d2d2eSraf { 356*753d2d2eSraf 357*753d2d2eSraf errlog(BEGIN, "symtab_set_function() {"); 358*753d2d2eSraf Symtab.Function = allocate_entry(Symtab.Function, 359*753d2d2eSraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1); 360*753d2d2eSraf errlog(END, "}"); 361*753d2d2eSraf } 362*753d2d2eSraf 363*753d2d2eSraf ENTRY * 364*753d2d2eSraf symtab_get_function(void) 365*753d2d2eSraf { 366*753d2d2eSraf errlog(BEGIN, "symtab_get_function() {"); errlog(END, "}"); 367*753d2d2eSraf if (Symtab.Function == NULL) 368*753d2d2eSraf return (NULL); 369*753d2d2eSraf else 370*753d2d2eSraf return ((Symtab.Function->e_valid)? Symtab.Function: NULL); 371*753d2d2eSraf } 372*753d2d2eSraf 373*753d2d2eSraf void 374*753d2d2eSraf symtab_set_exception(char *value, int line, char *file) 375*753d2d2eSraf { 376*753d2d2eSraf 377*753d2d2eSraf errlog(BEGIN, "symtab_set_exception() {"); 378*753d2d2eSraf Symtab.Exception = allocate_entry(Symtab.Exception, 379*753d2d2eSraf value, line, file, COMPOSITE, "", "", 0, "", -1, -1); 380*753d2d2eSraf errlog(END, "}"); 381*753d2d2eSraf } 382*753d2d2eSraf 383*753d2d2eSraf ENTRY * 384*753d2d2eSraf symtab_get_exception(void) 385*753d2d2eSraf { 386*753d2d2eSraf 387*753d2d2eSraf errlog(BEGIN, "symtab_get_exception() {"); errlog(END, "}"); 388*753d2d2eSraf if (Symtab.Exception == NULL) 389*753d2d2eSraf return (NULL); 390*753d2d2eSraf else 391*753d2d2eSraf return ((Symtab.Exception->e_valid)? Symtab.Exception: NULL); 392*753d2d2eSraf } 393*753d2d2eSraf 394*753d2d2eSraf void 395*753d2d2eSraf symtab_set_errval(char *name, int line, char *file, char *type, char *basetype, 396*753d2d2eSraf int levels) 397*753d2d2eSraf { 398*753d2d2eSraf 399*753d2d2eSraf errlog(BEGIN, "symtab_set_errval() {"); 400*753d2d2eSraf Symtab.Errval = allocate_entry(Symtab.Errval, 401*753d2d2eSraf name, line, file, PRIMITIVE, type, basetype, levels, 402*753d2d2eSraf "", -1, -1); 403*753d2d2eSraf errlog(END, "}"); 404*753d2d2eSraf } 405*753d2d2eSraf 406*753d2d2eSraf ENTRY * 407*753d2d2eSraf symtab_get_errval(void) 408*753d2d2eSraf { 409*753d2d2eSraf 410*753d2d2eSraf errlog(BEGIN, "symtab_get_errval() {"); errlog(END, "}"); 411*753d2d2eSraf if (Symtab.Errval == NULL) 412*753d2d2eSraf return (NULL); 413*753d2d2eSraf else 414*753d2d2eSraf return ((Symtab.Errval->e_valid)? Symtab.Errval: NULL); 415*753d2d2eSraf } 416*753d2d2eSraf 417*753d2d2eSraf /* 418*753d2d2eSraf * Manually written access function for tables of ENTRYs 419*753d2d2eSraf */ 420*753d2d2eSraf void 421*753d2d2eSraf symtab_add_args(char *name, int line, char *file, 422*753d2d2eSraf char *type, char *basetype, int levels) 423*753d2d2eSraf { 424*753d2d2eSraf 425*753d2d2eSraf errlog(BEGIN, "symtab_add_args() {"); 426*753d2d2eSraf if (Symtab.Args == NULL) { 427*753d2d2eSraf Symtab.Args = create_entry_table(10); 428*753d2d2eSraf } 429*753d2d2eSraf Symtab.Args = add_entry_table(Symtab.Args, 430*753d2d2eSraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1); 431*753d2d2eSraf errlog(END, "}"); 432*753d2d2eSraf } 433*753d2d2eSraf 434*753d2d2eSraf static int curr_arg; 435*753d2d2eSraf 436*753d2d2eSraf ENTRY * 437*753d2d2eSraf symtab_get_first_arg(void) 438*753d2d2eSraf { 439*753d2d2eSraf 440*753d2d2eSraf errlog(BEGIN, "symtab_get_first_arg() {"); errlog(END, "}"); 441*753d2d2eSraf curr_arg = 1; 442*753d2d2eSraf return (get_entry_table(Symtab.Args, 0)); 443*753d2d2eSraf } 444*753d2d2eSraf 445*753d2d2eSraf ENTRY * 446*753d2d2eSraf symtab_get_next_arg(void) 447*753d2d2eSraf { 448*753d2d2eSraf 449*753d2d2eSraf errlog(BEGIN, "symtab_get_next_arg() {"); errlog(END, "}"); 450*753d2d2eSraf return (get_entry_table(Symtab.Args, curr_arg++)); 451*753d2d2eSraf } 452*753d2d2eSraf 453*753d2d2eSraf ENTRY * 454*753d2d2eSraf symtab_get_last_arg(void) 455*753d2d2eSraf { 456*753d2d2eSraf 457*753d2d2eSraf errlog(BEGIN, "symtab_get_last_arg() {"); errlog(END, "}"); 458*753d2d2eSraf return (get_entry_table(Symtab.Args, Symtab.Args->used)); 459*753d2d2eSraf } 460*753d2d2eSraf 461*753d2d2eSraf void 462*753d2d2eSraf symtab_add_varargs(char *name, int line, char *file, char *type, char *print) 463*753d2d2eSraf { 464*753d2d2eSraf 465*753d2d2eSraf errlog(BEGIN, "symtab_add_varargs() {"); 466*753d2d2eSraf if (Symtab.Varargs == NULL) { 467*753d2d2eSraf Symtab.Varargs = create_entry_table(10); 468*753d2d2eSraf } 469*753d2d2eSraf Symtab.Varargs = add_entry_table(Symtab.Varargs, 470*753d2d2eSraf name, line, file, PRIMITIVE, type, print, 0, "", -1, -1); 471*753d2d2eSraf errlog(END, "}"); 472*753d2d2eSraf } 473*753d2d2eSraf 474*753d2d2eSraf static int curr_vararg; 475*753d2d2eSraf 476*753d2d2eSraf ENTRY * 477*753d2d2eSraf symtab_get_first_vararg(void) 478*753d2d2eSraf { 479*753d2d2eSraf 480*753d2d2eSraf errlog(BEGIN, "symtab_get_first_vararg() {"); errlog(END, "}"); 481*753d2d2eSraf curr_vararg = 1; 482*753d2d2eSraf return (get_entry_table(Symtab.Varargs, 0)); 483*753d2d2eSraf } 484*753d2d2eSraf 485*753d2d2eSraf ENTRY * 486*753d2d2eSraf symtab_get_next_vararg(void) 487*753d2d2eSraf { 488*753d2d2eSraf 489*753d2d2eSraf errlog(BEGIN, "symtab_get_next_vararg() {"); errlog(END, "}"); 490*753d2d2eSraf return (get_entry_table(Symtab.Varargs, curr_vararg++)); 491*753d2d2eSraf } 492*753d2d2eSraf 493*753d2d2eSraf void 494*753d2d2eSraf symtab_add_globals(char *name, int line, char *file, char *type, 495*753d2d2eSraf char *basetype, int levels) 496*753d2d2eSraf { 497*753d2d2eSraf 498*753d2d2eSraf errlog(BEGIN, "symtab_add_globals() {"); 499*753d2d2eSraf if (Symtab.Globals == NULL) { 500*753d2d2eSraf Symtab.Globals = create_entry_table(10); 501*753d2d2eSraf } 502*753d2d2eSraf Symtab.Globals = add_entry_table(Symtab.Globals, 503*753d2d2eSraf name, line, file, PRIMITIVE, type, basetype, levels, "", -1, -1); 504*753d2d2eSraf errlog(END, "}"); 505*753d2d2eSraf } 506*753d2d2eSraf 507*753d2d2eSraf 508*753d2d2eSraf static int curr_global; 509*753d2d2eSraf 510*753d2d2eSraf ENTRY * 511*753d2d2eSraf symtab_get_first_global(void) 512*753d2d2eSraf { 513*753d2d2eSraf 514*753d2d2eSraf errlog(BEGIN, "symtab_get_first_global() {"); errlog(END, "}"); 515*753d2d2eSraf curr_global = 1; 516*753d2d2eSraf return (get_entry_table(Symtab.Globals, 0)); 517*753d2d2eSraf } 518*753d2d2eSraf 519*753d2d2eSraf ENTRY * 520*753d2d2eSraf symtab_get_next_global(void) 521*753d2d2eSraf { 522*753d2d2eSraf 523*753d2d2eSraf errlog(BEGIN, "symtab_get_next_global() {"); errlog(END, "}"); 524*753d2d2eSraf return (get_entry_table(Symtab.Globals, curr_global++)); 525*753d2d2eSraf } 526*753d2d2eSraf 527*753d2d2eSraf /* 528*753d2d2eSraf * manually written functions for accessing tables of strings 529*753d2d2eSraf */ 530*753d2d2eSraf 531*753d2d2eSraf /* 532*753d2d2eSraf * symtab_add_print_types -- add only non-void print types (due to 533*753d2d2eSraf * parser errors in collect.c, yuck). Also note trick compare... 534*753d2d2eSraf * TBD : common code in db, symtab needs to be 535*753d2d2eSraf * pulled out, as they're getting out of sync. 536*753d2d2eSraf */ 537*753d2d2eSraf void 538*753d2d2eSraf symtab_add_print_types(char *print_type, char *c_type) 539*753d2d2eSraf { 540*753d2d2eSraf char buffer[MAXLINE]; 541*753d2d2eSraf 542*753d2d2eSraf errlog(BEGIN, "symtab_add_print_types() {"); 543*753d2d2eSraf #ifdef notdef 544*753d2d2eSraf if (strcmp(print_type, "void") == 0 || *print_type == NULL) { 545*753d2d2eSraf errlog(END, "}"); 546*753d2d2eSraf return; 547*753d2d2eSraf } 548*753d2d2eSraf #endif 549*753d2d2eSraf (void) snprintf(buffer, sizeof (buffer), "%s, %s", print_type, c_type); 550*753d2d2eSraf if (Symtab.Print_Types == NULL) { 551*753d2d2eSraf Symtab.Print_Types = create_string_table(50); 552*753d2d2eSraf } 553*753d2d2eSraf if (in_string_table(Symtab.Print_Types, print_type) == NO) { 554*753d2d2eSraf Symtab.Print_Types = add_string_table(Symtab.Print_Types, 555*753d2d2eSraf &buffer[0]); 556*753d2d2eSraf } 557*753d2d2eSraf errlog(END, "}"); 558*753d2d2eSraf } 559*753d2d2eSraf 560*753d2d2eSraf static table_t * 561*753d2d2eSraf symtab_free_print_types(table_t *t) 562*753d2d2eSraf { 563*753d2d2eSraf errlog(BEGIN, "symtab_free_print_types() {"); errlog(END, "}"); 564*753d2d2eSraf return (free_string_table(t)); 565*753d2d2eSraf } 566*753d2d2eSraf 567*753d2d2eSraf 568*753d2d2eSraf static int curr_print_type; 569*753d2d2eSraf 570*753d2d2eSraf char * 571*753d2d2eSraf symtab_get_first_print_type(void) 572*753d2d2eSraf { 573*753d2d2eSraf 574*753d2d2eSraf errlog(BEGIN, "symtab_get_first_print_type() {"); errlog(END, "}"); 575*753d2d2eSraf curr_print_type = 1; 576*753d2d2eSraf return (get_string_table(Symtab.Print_Types, 0)); 577*753d2d2eSraf } 578*753d2d2eSraf 579*753d2d2eSraf char * 580*753d2d2eSraf symtab_get_next_print_type(void) 581*753d2d2eSraf { 582*753d2d2eSraf 583*753d2d2eSraf errlog(BEGIN, "symtab_get_next_print_type() {"); errlog(END, "}"); 584*753d2d2eSraf return (get_string_table(Symtab.Print_Types, curr_print_type++)); 585*753d2d2eSraf } 586*753d2d2eSraf 587*753d2d2eSraf void 588*753d2d2eSraf symtab_add_includes(char *value) 589*753d2d2eSraf { 590*753d2d2eSraf 591*753d2d2eSraf errlog(BEGIN, "symtab_add_includes() {"); 592*753d2d2eSraf if (Symtab.Includes == NULL) { 593*753d2d2eSraf Symtab.Includes = create_string_table(50); 594*753d2d2eSraf } 595*753d2d2eSraf if (in_string_table(Symtab.Includes, value) == NO) { 596*753d2d2eSraf Symtab.Includes = add_string_table(Symtab.Includes, value); 597*753d2d2eSraf } 598*753d2d2eSraf errlog(END, "}"); 599*753d2d2eSraf } 600*753d2d2eSraf 601*753d2d2eSraf static int curr_include; 602*753d2d2eSraf 603*753d2d2eSraf char * 604*753d2d2eSraf symtab_get_first_include(void) 605*753d2d2eSraf { 606*753d2d2eSraf 607*753d2d2eSraf errlog(BEGIN, "symtab_get_first_include() {"); errlog(END, "}"); 608*753d2d2eSraf curr_include = 1; 609*753d2d2eSraf return (get_string_table(Symtab.Includes, 0)); 610*753d2d2eSraf } 611*753d2d2eSraf 612*753d2d2eSraf char * 613*753d2d2eSraf symtab_get_next_include(void) 614*753d2d2eSraf { 615*753d2d2eSraf 616*753d2d2eSraf errlog(BEGIN, "symtab_get_next_include() {"); errlog(END, "}"); 617*753d2d2eSraf return (get_string_table(Symtab.Includes, curr_include++)); 618*753d2d2eSraf } 619*753d2d2eSraf 620*753d2d2eSraf 621*753d2d2eSraf void 622*753d2d2eSraf symtab_sort_includes(void) 623*753d2d2eSraf { 624*753d2d2eSraf errlog(BEGIN, "symtab_sort_includes() {"); 625*753d2d2eSraf sort_string_table(Symtab.Includes); 626*753d2d2eSraf errlog(END, "}"); 627*753d2d2eSraf } 628*753d2d2eSraf 629*753d2d2eSraf /* 630*753d2d2eSraf * ENTRYs -- access functions to contents of an entry. 631*753d2d2eSraf */ 632*753d2d2eSraf 633*753d2d2eSraf char * 634*753d2d2eSraf name_of(ENTRY *e) 635*753d2d2eSraf { 636*753d2d2eSraf return (e->e_name); 637*753d2d2eSraf } 638*753d2d2eSraf 639*753d2d2eSraf int 640*753d2d2eSraf validity_of(ENTRY *e) 641*753d2d2eSraf { 642*753d2d2eSraf 643*753d2d2eSraf if (e == NULL) 644*753d2d2eSraf return (NO); 645*753d2d2eSraf else 646*753d2d2eSraf return (e->e_valid); 647*753d2d2eSraf } 648*753d2d2eSraf 649*753d2d2eSraf int 650*753d2d2eSraf line_of(ENTRY *e) 651*753d2d2eSraf { 652*753d2d2eSraf return (e->e_line); 653*753d2d2eSraf } 654*753d2d2eSraf 655*753d2d2eSraf 656*753d2d2eSraf char * 657*753d2d2eSraf file_of(ENTRY *e) 658*753d2d2eSraf { 659*753d2d2eSraf return (e->e_file); 660*753d2d2eSraf } 661*753d2d2eSraf 662*753d2d2eSraf /* 663*753d2d2eSraf * x_type_of -- return (type with an extension: an embedded %s where 664*753d2d2eSraf * the name goes. 665*753d2d2eSraf */ 666*753d2d2eSraf char * 667*753d2d2eSraf x_type_of(ENTRY *e) 668*753d2d2eSraf { 669*753d2d2eSraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) 670*753d2d2eSraf return (e->e_type); 671*753d2d2eSraf else 672*753d2d2eSraf return (NULL); 673*753d2d2eSraf } 674*753d2d2eSraf 675*753d2d2eSraf 676*753d2d2eSraf /* 677*753d2d2eSraf * type_of -- return (just the type, with the %s removed. This is the common 678*753d2d2eSraf * case, and its also the slowest... TBD. 679*753d2d2eSraf */ 680*753d2d2eSraf char * 681*753d2d2eSraf type_of(ENTRY *e) 682*753d2d2eSraf { 683*753d2d2eSraf static char buffer[MAXLINE]; 684*753d2d2eSraf char *p, *q; 685*753d2d2eSraf 686*753d2d2eSraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) { 687*753d2d2eSraf p = e->e_type; 688*753d2d2eSraf q = &buffer[0]; 689*753d2d2eSraf while (*p != NULL) { 690*753d2d2eSraf if (*p == '%') { 691*753d2d2eSraf p += 2; 692*753d2d2eSraf } else { 693*753d2d2eSraf *q++ = *p++; 694*753d2d2eSraf } 695*753d2d2eSraf } 696*753d2d2eSraf *q = NULL; 697*753d2d2eSraf return (strtrim(&buffer[0])); 698*753d2d2eSraf } 699*753d2d2eSraf else 700*753d2d2eSraf return (NULL); 701*753d2d2eSraf } 702*753d2d2eSraf 703*753d2d2eSraf char * 704*753d2d2eSraf basetype_of(ENTRY *e) 705*753d2d2eSraf { 706*753d2d2eSraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) 707*753d2d2eSraf return (e->e_basetype); 708*753d2d2eSraf else 709*753d2d2eSraf return (NULL); 710*753d2d2eSraf } 711*753d2d2eSraf 712*753d2d2eSraf int 713*753d2d2eSraf levels_of(ENTRY *e) 714*753d2d2eSraf { 715*753d2d2eSraf if (e != NULL && (e->e_kind == PRIMITIVE || e->e_kind == VARARG)) 716*753d2d2eSraf return (e->e_levels); 717*753d2d2eSraf else 718*753d2d2eSraf return (NULL); 719*753d2d2eSraf } 720*753d2d2eSraf 721*753d2d2eSraf char * 722*753d2d2eSraf inverse_of(ENTRY *e) 723*753d2d2eSraf { 724*753d2d2eSraf 725*753d2d2eSraf if (e != NULL && e->e_kind == COMPOSITE) 726*753d2d2eSraf return (e->e_attribute); 727*753d2d2eSraf else 728*753d2d2eSraf return (NULL); 729*753d2d2eSraf } 730*753d2d2eSraf 731*753d2d2eSraf char * 732*753d2d2eSraf selector_of(ENTRY *e) 733*753d2d2eSraf { 734*753d2d2eSraf 735*753d2d2eSraf if (e != NULL && e->e_kind == VARARG) 736*753d2d2eSraf return (e->e_attribute); 737*753d2d2eSraf else 738*753d2d2eSraf return (NULL); 739*753d2d2eSraf } 740*753d2d2eSraf 741*753d2d2eSraf int 742*753d2d2eSraf preuses_of(ENTRY *e) 743*753d2d2eSraf { 744*753d2d2eSraf 745*753d2d2eSraf if (e) 746*753d2d2eSraf return (e->e_pre_uses); 747*753d2d2eSraf else 748*753d2d2eSraf return (-1); 749*753d2d2eSraf } 750*753d2d2eSraf 751*753d2d2eSraf int 752*753d2d2eSraf postuses_of(ENTRY *e) 753*753d2d2eSraf { 754*753d2d2eSraf 755*753d2d2eSraf if (e) 756*753d2d2eSraf return (e->e_post_uses); 757*753d2d2eSraf else 758*753d2d2eSraf return (-1); 759*753d2d2eSraf } 760*753d2d2eSraf 761*753d2d2eSraf 762*753d2d2eSraf /* 763*753d2d2eSraf * allocate_entry -- make a parameter list into a complete 764*753d2d2eSraf * ENTRY struct, allocated dynamically. 765*753d2d2eSraf */ 766*753d2d2eSraf /* ARGSUSED -- lint bug */ 767*753d2d2eSraf static ENTRY * 768*753d2d2eSraf allocate_entry(ENTRY *e, 769*753d2d2eSraf char *name, int line, char *file, 770*753d2d2eSraf int kind, char *type, char *basetype, int levels, char *attribute, 771*753d2d2eSraf int npre, int npost) 772*753d2d2eSraf { 773*753d2d2eSraf 774*753d2d2eSraf errlog(BEGIN, "allocate_entry() {"); 775*753d2d2eSraf if (e == NULL) { 776*753d2d2eSraf if ((e = (ENTRY *)calloc(1, sizeof (ENTRY))) == NULL) { 777*753d2d2eSraf errlog(FATAL, "can't allocate space for an ENTRY"); 778*753d2d2eSraf } 779*753d2d2eSraf } 780*753d2d2eSraf errlog(END, "}"); 781*753d2d2eSraf return (set_entry(e, name, line, file, kind, type, basetype, levels, 782*753d2d2eSraf attribute, npre, npost)); 783*753d2d2eSraf } 784*753d2d2eSraf 785*753d2d2eSraf /* 786*753d2d2eSraf * set_entry -- set a passed-in entry, using 787*753d2d2eSraf * passed parameters, to values suitable for a 788*753d2d2eSraf * symtab entry 789*753d2d2eSraf */ 790*753d2d2eSraf static ENTRY * 791*753d2d2eSraf set_entry(ENTRY *e, 792*753d2d2eSraf char *name, int line, char *file, 793*753d2d2eSraf int kind, char *type, char *basetype, int levels, char *attribute, 794*753d2d2eSraf int npre, int npost) 795*753d2d2eSraf { 796*753d2d2eSraf 797*753d2d2eSraf errlog(BEGIN, "set_entry() {"); 798*753d2d2eSraf if (e == NULL) { 799*753d2d2eSraf errlog(FATAL, "programmer error: passed a NULL ENTRY"); 800*753d2d2eSraf } 801*753d2d2eSraf e->e_name = strset(e->e_name, name); 802*753d2d2eSraf e->e_valid = YES; 803*753d2d2eSraf e->e_line = line, 804*753d2d2eSraf e->e_file = strset(e->e_file, file); 805*753d2d2eSraf e->e_kind = kind; 806*753d2d2eSraf switch (kind) { 807*753d2d2eSraf case PRIMITIVE: 808*753d2d2eSraf e->e_type = strset(e->e_type, type); 809*753d2d2eSraf e->e_basetype = strset(e->e_basetype, basetype); 810*753d2d2eSraf e->e_levels = levels; 811*753d2d2eSraf break; 812*753d2d2eSraf case COMPOSITE: 813*753d2d2eSraf e->e_attribute = strset(e->e_attribute, attribute); 814*753d2d2eSraf break; 815*753d2d2eSraf case VARARG: 816*753d2d2eSraf e->e_attribute = strset(e->e_attribute, attribute); 817*753d2d2eSraf break; 818*753d2d2eSraf default: 819*753d2d2eSraf errlog(FATAL, "programmer error: impossible kind of ENTRY"); 820*753d2d2eSraf } 821*753d2d2eSraf 822*753d2d2eSraf e->e_pre_uses = npre; 823*753d2d2eSraf e->e_post_uses = npost; 824*753d2d2eSraf errlog(END, "}"); 825*753d2d2eSraf return (e); 826*753d2d2eSraf } 827*753d2d2eSraf 828*753d2d2eSraf 829*753d2d2eSraf /* 830*753d2d2eSraf * free_entry -- really just mark an entry as invalid 831*753d2d2eSraf */ 832*753d2d2eSraf static ENTRY * 833*753d2d2eSraf free_entry(ENTRY *e) 834*753d2d2eSraf { 835*753d2d2eSraf if (e != NULL) 836*753d2d2eSraf e->e_valid = NO; 837*753d2d2eSraf return (e); 838*753d2d2eSraf } 839*753d2d2eSraf 840*753d2d2eSraf 841*753d2d2eSraf /* 842*753d2d2eSraf * ENTRY tables. 843*753d2d2eSraf */ 844*753d2d2eSraf #define ENTRY_INCREMENT 10 845*753d2d2eSraf 846*753d2d2eSraf static EHEAD * 847*753d2d2eSraf create_entry_table(int n) 848*753d2d2eSraf { 849*753d2d2eSraf EHEAD *p; 850*753d2d2eSraf 851*753d2d2eSraf errlog(BEGIN, "create_entry_table() {"); 852*753d2d2eSraf if ((p = (EHEAD *)calloc(1, 853*753d2d2eSraf sizeof (EHEAD)+(n*sizeof (ENTRY)))) == NULL) { 854*753d2d2eSraf errlog(FATAL, "can't allocate space for an ENTRY table"); 855*753d2d2eSraf } 856*753d2d2eSraf p->used = -1; 857*753d2d2eSraf p->n_entries = n; 858*753d2d2eSraf errlog(END, "}"); 859*753d2d2eSraf return (p); 860*753d2d2eSraf } 861*753d2d2eSraf 862*753d2d2eSraf static EHEAD * 863*753d2d2eSraf add_entry_table(EHEAD *t, char *name, int line, char *file, 864*753d2d2eSraf int kind, char *type, char *basetype, int levels, char *attribute, 865*753d2d2eSraf int npre, int npost) 866*753d2d2eSraf { 867*753d2d2eSraf EHEAD *t2; 868*753d2d2eSraf 869*753d2d2eSraf errlog(BEGIN, "add_entry_table() {"); 870*753d2d2eSraf if (t == NULL) { 871*753d2d2eSraf errlog(FATAL, "programmer error: tried to add to NULL EHEAD"); 872*753d2d2eSraf } 873*753d2d2eSraf t->used++; 874*753d2d2eSraf if (t->used >= t->n_entries) { 875*753d2d2eSraf if ((t2 = (EHEAD *)realloc(t, 876*753d2d2eSraf sizeof (EHEAD)+(sizeof (ENTRY)* 877*753d2d2eSraf (t->n_entries+ENTRY_INCREMENT)))) == NULL) { 878*753d2d2eSraf errlog(FATAL, "out of memory extending an EHEAD"); 879*753d2d2eSraf } 880*753d2d2eSraf t = t2; 881*753d2d2eSraf clear_entries(t, t->n_entries, (t->n_entries+ENTRY_INCREMENT)); 882*753d2d2eSraf t->n_entries += ENTRY_INCREMENT; 883*753d2d2eSraf } 884*753d2d2eSraf (void) set_entry(&t->entry[t->used], 885*753d2d2eSraf name, line, file, kind, type, basetype, levels, 886*753d2d2eSraf attribute, npre, npost); 887*753d2d2eSraf errlog(END, "}"); 888*753d2d2eSraf return (t); 889*753d2d2eSraf } 890*753d2d2eSraf 891*753d2d2eSraf static ENTRY * 892*753d2d2eSraf get_entry_table(EHEAD *t, int index) 893*753d2d2eSraf { 894*753d2d2eSraf if (t == NULL) { 895*753d2d2eSraf return (NULL); 896*753d2d2eSraf } else if (index > t->used) { 897*753d2d2eSraf return (NULL); 898*753d2d2eSraf } else { 899*753d2d2eSraf return (&(t->entry[index])); 900*753d2d2eSraf } 901*753d2d2eSraf } 902*753d2d2eSraf 903*753d2d2eSraf static EHEAD * 904*753d2d2eSraf free_entry_table(EHEAD *t) 905*753d2d2eSraf { 906*753d2d2eSraf if (t != NULL) 907*753d2d2eSraf t->used = -1; 908*753d2d2eSraf return (t); 909*753d2d2eSraf } 910*753d2d2eSraf 911*753d2d2eSraf static void 912*753d2d2eSraf clear_entries(EHEAD *t, int start, int end) 913*753d2d2eSraf { 914*753d2d2eSraf int i; 915*753d2d2eSraf 916*753d2d2eSraf for (i = start; i < end; i++) { 917*753d2d2eSraf (void) memset(&t->entry[i], 0, sizeof (ENTRY)); 918*753d2d2eSraf } 919*753d2d2eSraf } 920