Annotation of researchv10no/cmd/worm/sym.c, revision 1.1.1.1

1.1       root        1: #include       <libc.h>
                      2: #include       "worm.h"
                      3: #include       "sym.h"
                      4: 
                      5: #define        NHASH   20011   /* prime please */
                      6: #define        HASHMUL 79L     /* this is a good value */
                      7: static Symtab *hash[NHASH];
                      8: int sym_mem_fail;
                      9: 
                     10: syminit()
                     11: {
                     12:        register Symtab **s, *ss;
                     13: 
                     14:        for(s = hash; s < &hash[NHASH]; s++){
                     15:                for(ss = *s; ss; ss = ss->next)
                     16:                        free((char *)ss);
                     17:                *s = 0;
                     18:        }
                     19: }
                     20: 
                     21: void *
                     22: symlook(sym, space, install)
                     23:        char *sym;
                     24:        void *install;
                     25: {
                     26:        register long h;
                     27:        register char *p;
                     28:        register Symtab *s;
                     29: 
                     30:        for(p = sym, h = space; *p; h += *p++)
                     31:                h *= HASHMUL;
                     32:        if(h < 0)
                     33:                h = ~h;
                     34:        h %= NHASH;
                     35:        for(s = hash[h]; s; s = s->next)
                     36:                if((s->space == space) && (strcmp(s->name, sym) == 0)){
                     37:                        if(install)
                     38:                                s->value = install;
                     39:                        return(s->value);
                     40:                }
                     41:        if(install){
                     42:                s = (Symtab *)malloc((unsigned)sizeof(Symtab));
                     43:                if(s == 0){
                     44:                        sym_mem_fail++;
                     45:                        return(install);
                     46:                }
                     47:                s->space = space;
                     48:                s->name = sym;
                     49:                s->value = install;
                     50:                s->next = hash[h];
                     51:                hash[h] = s;
                     52:        }
                     53:        return(install);
                     54: }
                     55: 
                     56: symdel(sym, space)
                     57:        char *sym;
                     58: {
                     59:        register long h;
                     60:        register char *p;
                     61:        register Symtab *s, *ls;
                     62: 
                     63:        for(p = sym, h = space; *p; h += *p++)
                     64:                h *= HASHMUL;
                     65:        if(h < 0)
                     66:                h = ~h;
                     67:        h %= NHASH;
                     68:        for(s = hash[h], ls = 0; s; ls = s, s = s->next)
                     69:                if((s->space == space) && (strcmp(s->name, sym) == 0)){
                     70:                        if(ls)
                     71:                                ls->next = s->next;
                     72:                        else
                     73:                                hash[h] = s->next;
                     74:                        free((char *)s);
                     75:                }
                     76: }
                     77: 
                     78: symtraverse(space, fn)
                     79:        void (*fn)();
                     80: {
                     81:        register Symtab **s, *ss, *next;
                     82: 
                     83:        for(s = hash; s < &hash[NHASH]; s++)
                     84:                for(ss = *s; ss; ss = next){
                     85:                        next = ss->next;
                     86:                        if(ss->space == space)
                     87:                                (*fn)(ss->value);
                     88:                }
                     89: }
                     90: 
                     91: symstat()
                     92: {
                     93:        register Symtab **s, *ss;
                     94:        int n[NHASH];
                     95:        register i, j;
                     96:        int tot;
                     97:        double d;
                     98: 
                     99:        for(i = 0; i < NHASH; i++)
                    100:                n[i] = 0;
                    101:        for(s = hash; s < &hash[NHASH]; s++){
                    102:                for(j = 0, ss = *s; ss; ss = ss->next)
                    103:                        j++;
                    104:                n[j]++;
                    105:        }
                    106:        Fprint(1, "N=%ld mul=%ld\n", NHASH, HASHMUL);
                    107:        for(i = 0, d = 0, tot = 0; i < NHASH; i++){
                    108:                if(n[i]) Fprint(1, "%d of length %d\n", n[i], i);
                    109:                d += n[i]*i;
                    110:                if(i) tot += n[i];
                    111:        }
                    112:        Fprint(1, "ave len = %g\n", d/tot);
                    113: }
                    114: 
                    115: symdump(sym, space)
                    116:        char *sym;
                    117: {
                    118:        register long h;
                    119:        register char *p;
                    120:        register Symtab *s;
                    121: 
                    122:        for(p = sym, h = space; *p; h += *p++)
                    123:                h *= HASHMUL;
                    124:        if(h < 0)
                    125:                h = ~h;
                    126:        h %= NHASH;
                    127:        print("symdump(%s):\n", sym);
                    128:        for(s = hash[h]; s; s = s->next)
                    129:                print("\t%s: space=%d value=%ld\n", s->name, s->space, s->value);
                    130: }

unix.superglobalmegacorp.com

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