|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 1984 by Eric C. Cooper. ! 3: * All rights reserved. ! 4: */ ! 5: #ifndef lint ! 6: static char RCSid[] = "$Header: symbols.c,v 2.0 85/11/21 07:21:46 jqj Exp $"; ! 7: #endif ! 8: ! 9: /* $Log: symbols.c,v $ ! 10: * Revision 2.0 85/11/21 07:21:46 jqj ! 11: * 4.3BSD standard release ! 12: * ! 13: * Revision 1.4 85/03/26 06:10:36 jqj ! 14: * *** empty log message *** ! 15: * ! 16: * Revision 1.4 85/03/26 06:10:36 jqj ! 17: * Revised public alpha-test version, released 26 March 1985 ! 18: * ! 19: * Revision 1.3 85/03/11 16:40:14 jqj ! 20: * Public alpha-test version, released 11 March 1985 ! 21: * ! 22: * Revision 1.2 85/02/21 11:06:00 jqj ! 23: * alpha test version ! 24: * ! 25: * Revision 1.1 85/02/15 13:55:40 jqj ! 26: * Initial revision ! 27: * ! 28: */ ! 29: ! 30: /* ! 31: * Symbol table management routines ! 32: */ ! 33: ! 34: #include "compiler.h" ! 35: ! 36: struct object *SymbolTables; ! 37: struct object EnumSymbols; ! 38: /* ! 39: ! 40: * Symbol table management. Find a symbol given a known symbol table. ! 41: * The routines lookup() and addsymbol() are the ONLY routines that ! 42: * understand the format of the symbol table, and should be the only ! 43: * routines that use ocar() and ocdr(). ! 44: */ ! 45: static struct object * ! 46: lookup(name, symlist) ! 47: char *name; ! 48: struct object *symlist; ! 49: { ! 50: struct object *op; ! 51: ! 52: for (op = symlist; op != ONIL; op = ocdr(op)) { ! 53: if (streq(op->o_name, name)) ! 54: return (op); ! 55: } ! 56: return (ONIL); ! 57: } ! 58: ! 59: static struct object * ! 60: addsymbol(name,osymp) ! 61: char *name; ! 62: struct object **osymp; ! 63: { ! 64: struct object *o; ! 65: ! 66: o = New(struct object); ! 67: o->o_class = O_UNKNOWN; ! 68: /* (jqj)? use binary-tree symboltable here */ ! 69: ocdr(o) = *osymp; ! 70: *osymp = o; ! 71: o->o_name = copy(name); ! 72: return(o); ! 73: } ! 74: ! 75: struct object * ! 76: make_symbol(name,symboltablename) ! 77: char *name; ! 78: char *symboltablename; ! 79: { ! 80: struct object *osym, *rsym; ! 81: ! 82: if (symboltablename == NULL) { ! 83: rsym = addsymbol(name, &(EnumSymbols.o_symboltable)); ! 84: rsym->o_module = ""; /* not NULL */ ! 85: rsym->o_modnumber = 0; ! 86: rsym->o_modversion = 0; ! 87: return(rsym); ! 88: } ! 89: else if ((osym = lookup(symboltablename, SymbolTables))) { ! 90: rsym = addsymbol(name, &(osym->o_symboltable)); ! 91: rsym->o_module = osym->o_module; ! 92: rsym->o_modnumber = osym->o_modnumber; ! 93: rsym->o_modversion = osym->o_modversion; ! 94: return(rsym); ! 95: } ! 96: else { ! 97: error(ERROR,"Internal error: Symbol table %s undefined.", ! 98: symboltablename); ! 99: return(ONIL); ! 100: } ! 101: } ! 102: ! 103: struct object * ! 104: make_module(name,number,version) ! 105: char *name; /* Courier module name */ ! 106: char *number; /* Courier program number */ ! 107: char *version; ! 108: { ! 109: struct object *symbol; ! 110: ! 111: symbol = addsymbol(name, &SymbolTables); ! 112: symbol->o_class = O_SYMBOLTABLE; ! 113: symbol->o_name = name; ! 114: symbol->o_module = name; ! 115: symbol->o_modnumber = stringtocard(number); ! 116: symbol->o_modversion = stringtocard(version); ! 117: return(symbol); ! 118: } ! 119: ! 120: /* ! 121: * Check that a program name, number, version group is already defined. ! 122: * Returns TRUE if name, number, and version all match ! 123: */ ! 124: check_module_def(name,number,version) ! 125: char *name, *number, *version; ! 126: { ! 127: struct object *module; ! 128: ! 129: if ((module = lookup(name, SymbolTables)) == (struct object *) NULL) ! 130: return(0); ! 131: if (stringtocard(version) != module->o_modversion || ! 132: stringtocard(number) != module->o_modnumber) ! 133: return(0); ! 134: return(1); /* for now */ ! 135: } ! 136: ! 137: /* ! 138: * Check that a program name was listed in the DEPENDS UPON list. ! 139: * returns a pointer to the symbol if defined, else 0. ! 140: */ ! 141: check_dependency(name) ! 142: char *name; ! 143: { ! 144: return((int) lookup(name, SymbolTables)); ! 145: } ! 146: ! 147: /* (jqj) */ ! 148: struct object * ! 149: check_def(symbol,symboltablename) ! 150: char *symbol; /* name of the symbol */ ! 151: char *symboltablename; /* symbol table to examine */ ! 152: { ! 153: struct object *osym; ! 154: ! 155: if (symboltablename == NULL) { ! 156: osym = &EnumSymbols; ! 157: } ! 158: else if (! (osym = lookup(symboltablename, SymbolTables))) { ! 159: error(ERROR,"Internal error: Symbol table %s undefined.",symboltablename); ! 160: return(ONIL); ! 161: } ! 162: return(lookup(symbol, osym->o_symboltable)); ! 163: } ! 164: ! 165: ! 166: static char gensymstr[MAXSTR]; ! 167: ! 168: char * ! 169: gensym(leader) ! 170: char *leader; ! 171: { ! 172: static int n; ! 173: char buf[MAXSTR]; ! 174: ! 175: (void) sprintf(buf, "%s%s_%d", leader, gensymstr, ++n); ! 176: return (copy(buf)); ! 177: } ! 178: ! 179: setgensym(number,version) ! 180: char *number, *version; ! 181: { ! 182: (void) sprintf(gensymstr,"%s",number); ! 183: } ! 184: ! 185: define_enumeration_symbol(sym, value) ! 186: struct object *sym; ! 187: char *value; ! 188: { ! 189: class_of(sym) = O_ENUMTAG; ! 190: sym->o_enum = New(struct enumtag); ! 191: sym->o_enum->en_name = name_of(sym); ! 192: sym->o_enum->en_value = stringtocard(value); ! 193: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.