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