Annotation of 42BSD/ucb/pascal/pdx/symtab/symtab.c, revision 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.