Annotation of 42BSD/ucb/pascal/pdx/symtab/symtab.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1982 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)symtab.c 1.2 5/19/82";
                      4: 
                      5: /*
                      6:  * Symbol table implementation.
                      7:  */
                      8: 
                      9: #include "defs.h"
                     10: #include "symtab.h"
                     11: #include "sym.h"
                     12: #include "sym/classes.h"
                     13: #include "sym/sym.rep"
                     14: 
                     15: /*
                     16:  * The symbol table structure is currently assumes no deletions.
                     17:  */
                     18: 
                     19: #define MAXHASHSIZE 1009    /* largest allowable hash table */
                     20: 
                     21: struct symtab {
                     22:     int size;
                     23:     int hshsize;
                     24:     SYM **symhsh;
                     25:     SYM *symarray;
                     26:     int symindex;
                     27: };
                     28: 
                     29: /*
                     30:  * Macro to hash a string.
                     31:  *
                     32:  * The hash value is returned through the "h" parameter which should
                     33:  * an unsigned integer.  The other parameters are the symbol table, "st",
                     34:  * and a pointer to the string to be hashed, "name".
                     35:  */
                     36: 
                     37: #define hash(h, st, name) \
                     38: { \
                     39:     register char *cp; \
                     40: \
                     41:     h = 0; \
                     42:     for (cp = name; *cp != '\0'; cp++) { \
                     43:        h = (h << 1) | (*cp); \
                     44:     } \
                     45:     h %= st->hshsize; \
                     46: }
                     47: 
                     48: /*
                     49:  * To create a symbol table, we allocate space for the symbols and
                     50:  * for a hash table that's twice as big (+1 to make it odd).
                     51:  */
                     52: 
                     53: SYMTAB *st_creat(size)
                     54: int size;
                     55: {
                     56:     register SYMTAB *st;
                     57:     register int i;
                     58: 
                     59:     st = alloc(1, SYMTAB);
                     60:     st->size = size;
                     61:     st->hshsize = 2*size + 1;
                     62:     if (st->hshsize > MAXHASHSIZE) {
                     63:        st->hshsize = MAXHASHSIZE;
                     64:     }
                     65:     st->symhsh = alloc(st->hshsize, SYM *);
                     66:     st->symarray = alloc(st->size, SYM);
                     67:     st->symindex = 0;
                     68:     for (i = 0; i < st->hshsize; i++) {
                     69:        st->symhsh[i] = NIL;
                     70:     }
                     71:     return(st);
                     72: }
                     73: 
                     74: st_destroy(st)
                     75: SYMTAB *st;
                     76: {
                     77:     dispose(st->symhsh);
                     78:     dispose(st->symarray);
                     79:     dispose(st);
                     80: }
                     81: 
                     82: /*
                     83:  * insert a symbol into a table
                     84:  */
                     85: 
                     86: SYM *st_insert(st, name)
                     87: register SYMTAB *st;
                     88: char *name;
                     89: {
                     90:     register SYM *s;
                     91:     register unsigned int h;
                     92:     static SYM zerosym;
                     93: 
                     94:     if (st == NIL) {
                     95:        panic("tried to insert into NIL table");
                     96:     }
                     97:     if (st->symindex >= st->size) {
                     98:        panic("too many symbols");
                     99:     }
                    100:     hash(h, st, name);
                    101:     s = &(st->symarray[st->symindex++]);
                    102:     *s = zerosym;
                    103:     s->symbol = name;
                    104:     s->next_sym = st->symhsh[h];
                    105:     st->symhsh[h] = s;
                    106:     return(s);
                    107: }
                    108: 
                    109: /*
                    110:  * symbol lookup
                    111:  */
                    112: 
                    113: SYM *st_lookup(st, name)
                    114: SYMTAB *st;
                    115: char *name;
                    116: {
                    117:     register SYM *s;
                    118:     register unsigned int h;
                    119: 
                    120:     if (st == NIL) {
                    121:        panic("tried to lookup in NIL table");
                    122:     }
                    123:     hash(h, st, name);
                    124:     for (s = st->symhsh[h]; s != NIL; s = s->next_sym) {
                    125:        if (strcmp(s->symbol, name) == 0) {
                    126:            break;
                    127:        }
                    128:     }
                    129:     return(s);
                    130: }
                    131: 
                    132: /*
                    133:  * Dump out all the variables associated with the given
                    134:  * procedure, function, or program at the given recursive level.
                    135:  *
                    136:  * This is quite inefficient.  We traverse the entire symbol table
                    137:  * each time we're called.  The assumption is that this routine
                    138:  * won't be called frequently enough to merit improved performance.
                    139:  */
                    140: 
                    141: dumpvars(f, frame)
                    142: SYM *f;
                    143: FRAME *frame;
                    144: {
                    145:     register SYM *s;
                    146:     SYM *first, *last;
                    147: 
                    148:     first = symtab->symarray;
                    149:     last = first + symtab->symindex - 1;
                    150:     for (s = first; s <= last; s++) {
                    151:        if (should_print(s, f)) {
                    152:            printv(s, frame);
                    153:            putchar('\n');
                    154:        }
                    155:     }
                    156: }
                    157: 
                    158: /*
                    159:  * Create an alias for a command.
                    160:  *
                    161:  * We put it into the given table with block 1, which is how it
                    162:  * is distinguished for printing purposes.
                    163:  */
                    164: 
                    165: enter_alias(table, new, old)
                    166: SYMTAB *table;
                    167: char *new, *old;
                    168: {
                    169:     SYM *s, *t;
                    170: 
                    171:     if ((s = st_lookup(table, old)) == NIL) {
                    172:        error("%s is not a known command", old);
                    173:     }
                    174:     if (st_lookup(table, new) != NIL) {
                    175:        error("cannot alias command names");
                    176:     }
                    177:     make_keyword(table, new, s->symvalue.token.toknum);
                    178:     t = st_insert(table, new);
                    179:     t->blkno = 1;
                    180:     t->symvalue.token.toknum = s->symvalue.token.toknum;
                    181:     t->type = s;
                    182: }
                    183: 
                    184: /*
                    185:  * Print out the currently active aliases.
                    186:  * The kludge is that the type pointer for an alias points to the
                    187:  * symbol it is aliased to.
                    188:  */
                    189: 
                    190: print_alias(table, name)
                    191: SYMTAB *table;
                    192: char *name;
                    193: {
                    194:     SYM *s, *t;
                    195:     SYM *first, *last;
                    196: 
                    197:     if (name != NIL) {
                    198:        s = st_lookup(table, name);
                    199:        if (s == NIL) {
                    200:            error("\"%s\" is not an alias", name);
                    201:        }
                    202:        printf("%s\n", s->type->symbol);
                    203:     } else {
                    204:        first = table->symarray;
                    205:        last = first + table->symindex - 1;
                    206:        for (s = first; s <= last; s++) {
                    207:            if (s->blkno == 1) {
                    208:                printf("%s\t%s\n", s->symbol, s->type->symbol);
                    209:            }
                    210:        }
                    211:     }
                    212: }
                    213: 
                    214: /*
                    215:  * Find a named type that points to t; return NIL if there is none.
                    216:  * This is necessary because of the way pi keeps symbols.
                    217:  */
                    218: 
                    219: #define NSYMS_BACK 20       /* size of local context to try */
                    220: 
                    221: LOCAL SYM *search();
                    222: 
                    223: SYM *findtype(t)
                    224: SYM *t;
                    225: {
                    226:     SYM *s;
                    227:     SYM *first, *last;
                    228:     SYM *lower;
                    229: 
                    230:     first = symtab->symarray;
                    231:     last = first + symtab->symindex - 1;
                    232:     if ((lower = t - NSYMS_BACK) < first) {
                    233:        lower = first;
                    234:     }
                    235:     if ((s = search(t, lower, last)) == NIL) {
                    236:        s = search(t, first, last);
                    237:     }
                    238:     return(s);
                    239: }
                    240: 
                    241: /*
                    242:  * Search the symbol table from first to last, looking for a
                    243:  * named type pointing to the given type symbol.
                    244:  */
                    245: 
                    246: LOCAL SYM *search(t, first, last)
                    247: SYM *t;
                    248: register SYM *first, *last;
                    249: {
                    250:     register SYM *s;
                    251: 
                    252:     for (s = first; s <= last; s++) {
                    253:        if (s->class == TYPE && s->type == t && s->symbol != NIL) {
                    254:            return(s);
                    255:        }
                    256:     }
                    257:     return(NIL);
                    258: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.