Annotation of researchv10no/cmd/movie/fdsymbol.c, revision 1.1

1.1     ! root        1: /* symbol.c:
        !             2:        General: functions for mapping {string} x {int} -> {int}
        !             3:        In pass 1: {name} x {viewnum} -> {int file line num}
        !             4:        In pass 2: {} x {int file line num} -> {slot num}
        !             5:                   Therefore be careful with blank strings
        !             6:  */
        !             7: 
        !             8: #include "fdevelop.h"
        !             9: 
        !            10: #define        steq(s, n, p) (p->innum == n && ((p->instr == s) || eq(p->instr,s)))
        !            11: 
        !            12: #define SIZE   2053
        !            13: Symbol *head[SIZE];
        !            14: 
        !            15: int hash(s, n) /* form hash value */
        !            16:        register char *s;
        !            17:        register int n;
        !            18: {
        !            19:        register int hashval;
        !            20: 
        !            21:        for (hashval = 0; *s != '\0'; s++)
        !            22:                hashval = (*s + 31 * hashval) % SIZE;
        !            23:        hashval = (31 * hashval + 1259 * n) % SIZE;
        !            24:        return hashval;
        !            25: }
        !            26: 
        !            27: Symbol *lookup(s, n)   /* return element with s, n */
        !            28:        register char *s;
        !            29:        register int n;
        !            30: {
        !            31:        register Symbol *p;
        !            32:        for (p = head[hash(s, n)]; p != NULL; p = p->next)
        !            33:                if (steq(s, n, p))
        !            34:                        return p;
        !            35:        return NULL;
        !            36: }
        !            37: 
        !            38: insert(s, n, v)        /* insert s, n with value v */
        !            39:        register char *s;
        !            40:        register int n;
        !            41:        int v;
        !            42: {
        !            43:        register Symbol *p;
        !            44:        char *q;
        !            45:        int i;
        !            46: 
        !            47:        /* fprintf(stderr, "Inserting: |%s|, %d with hash %d\n",
        !            48:                s, n, hash(s,n)); */
        !            49:        if (*s == '\0')
        !            50:                q = NULLSTR;
        !            51:        else {
        !            52:                q = emalloc(strlen(s)+1);
        !            53:                strcpy(q, s);
        !            54:        }
        !            55:        p = (Symbol *) emalloc(sizeof(Symbol));
        !            56:        p->instr = q;
        !            57:        p->innum = n;
        !            58:        p->outnum = v;
        !            59:        i = hash(s, n);
        !            60:        p->next = head[i];
        !            61:        head[i] = p;
        !            62: }
        !            63: 
        !            64: delete(s, n)   /* remove s, n */
        !            65:        char *s;
        !            66:        int n;
        !            67: {
        !            68:        Symbol *p, *pp;
        !            69:        int i;
        !            70: 
        !            71:        /* fprintf(stderr, "Deleting:  |%s|, %d with hash %d\n",
        !            72:                s, n, hash(s,n)); */
        !            73:        i = hash(s, n);
        !            74:        pp = NULL;
        !            75:        for (p = head[i]; p != NULL; p = p->next) {
        !            76:                if (steq(s, n, p))
        !            77:                        break;
        !            78:                pp = p;
        !            79:        }
        !            80:        if (p == NULL)
        !            81:                error(FATAL, "symtab bug: bad delete");
        !            82:        if (p->instr != NULLSTR)
        !            83:                efree(p->instr);
        !            84:        if (pp == NULL) {
        !            85:                head[i] = p->next;
        !            86:        } else {
        !            87:                pp->next = p->next;
        !            88:        }
        !            89:        efree((char *) p);
        !            90: }
        !            91: 
        !            92: opensymtab()   /* init table */
        !            93: {
        !            94:        int i;
        !            95: 
        !            96:        for (i = 0; i < SIZE; i++)
        !            97:                head[i] = NULL;
        !            98: }
        !            99: 
        !           100: closesymtab()  /* reclaim storage */
        !           101: {
        !           102:        int i;
        !           103:        Symbol *p, *np;
        !           104: 
        !           105:        for (i = 0; i < SIZE; i++)
        !           106:                for (p = head[i]; p != NULL; p = np) {
        !           107:                        if (p->instr != NULLSTR)
        !           108:                                efree(p->instr);
        !           109:                        np = p->next;
        !           110:                        efree((char *) p);
        !           111:                }
        !           112: }

unix.superglobalmegacorp.com

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