Annotation of researchv10no/cmd/ccom/common/lookup.c, revision 1.1.1.1

1.1       root        1: # include "mfile1.h"
                      2: 
                      3: lookup(name, s)        /* look up name: must agree with s w.r.t. STAG, SMOS and SHIDDEN */
                      4: register char *name; register s;
                      5: {
                      6:        register struct symtab *sp, *spstart;
                      7: 
                      8: # ifndef NODBG
                      9:        extern int ddebug;
                     10:        if (ddebug > 2) {
                     11:                printf("lookup(%s, %d), stwart=%d, instruct=%d\n",
                     12:                        name, s, stwart, instruct);
                     13:        }
                     14: # endif
                     15: 
                     16:        /* compute initial hash index */
                     17:        sp = spstart = stab + ((long)name & 077777) % SYMTSZ;
                     18: 
                     19:        do {     /* look for name */
                     20:                if (sp->stype == TNULL) {       /* empty slot */
                     21:                        sp->sflags = s;         /* set STAG, SMOS if needed */
                     22:                        sp->sname = name;
                     23:                        sp->stype = UNDEF;      /* turn off all others */
                     24:                        sp->sclass = SNULL;
                     25:                        return (sp-stab);
                     26:                }
                     27:                if (sp->sname == name && (sp->sflags & (STAG|SMOS|SHIDDEN)) == s)
                     28:                        return (sp-stab);
                     29:        } while ((++sp >= stab+SYMTSZ ? sp = stab : sp) != spstart);
                     30:        cerror("symbol table full");
                     31: }
                     32: 
                     33: #define HASHSIZE       1013
                     34: #define MAXHUSE                ((3*HASHSIZE)/4)
                     35: #define STRTABSIZE     4096
                     36: 
                     37: struct ht {
                     38:        struct ht *next;
                     39:        int nused;
                     40:        char *ptable[HASHSIZE];
                     41: } hashroot;
                     42: 
                     43: char *
                     44: hash(str)      /* Lookup str in hash tables; if not found, make new entry. */
                     45: char *str;
                     46: {
                     47:        char *calloc(), *savestr();
                     48:        register char *cp, **hstrp, **htptable;
                     49:        register int h, i;
                     50:        register struct ht *htp;
                     51:        int sh;
                     52: 
                     53:        for (cp=str, h=0; *cp; )
                     54:                h = (h << 1) + *cp++;
                     55:        sh = (h & 077777) % HASHSIZE;
                     56: 
                     57:        /* Look through each table for name.  Use quadratic re-hash. */
                     58:        for (htp = &hashroot; htp; htp = htp->next) {
                     59:                htptable = htp->ptable;
                     60:                for (h=sh, i=1; i<HASHSIZE; h += i, i += 2) {
                     61:                        if (h >= HASHSIZE)
                     62:                                h -= HASHSIZE;
                     63:                        hstrp = &htptable[h];
                     64:                        if (*hstrp) {
                     65:                                if (strcmp(*hstrp, str))
                     66:                                        continue;
                     67:                                return *hstrp;
                     68:                        } else {
                     69:                                if (htp->nused > MAXHUSE)
                     70:                                        break;
                     71:                                htp->nused++;
                     72:                                return (*hstrp = savestr(str));
                     73:                        }
                     74:                }
                     75:                if (htp->next == 0)
                     76:                        htp->next = (struct ht *)calloc(1,sizeof(struct ht));
                     77:        }
                     78:        cerror("cannot allocate hash table");
                     79: }
                     80: 
                     81: char *
                     82: savestr(str)   /* Place string into permanent storage. */
                     83: register char *str;
                     84: {
                     85:        char *memcpy(), *malloc();
                     86:        static char *curstp; static int nchleft;
                     87:        register int len;
                     88: 
                     89:        if ((len = strlen(str)+1) > nchleft &&
                     90:            (curstp = malloc(nchleft = len+STRTABSIZE)) == 0)
                     91:                cerror("cannot allocate string table");
                     92:        str = memcpy(curstp, str, len);
                     93:        curstp += len; nchleft -= len;
                     94:        return str;
                     95: }

unix.superglobalmegacorp.com

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