Annotation of researchv10no/cmd/efl/symtab.c, revision 1.1

1.1     ! root        1: #include "defs"
        !             2: 
        !             3: #ifdef HASHEDTABLE
        !             4: /* Basic symbol table maintainer.  Action depends on t:
        !             5: t = -1 Remove name from table
        !             6: t =  0 Put name in table if not there.  Copy name string
        !             7: t =  1 Find name in table if there, otherwise return 0.
        !             8: t =  2 Put name in table if not there.  Do not copy name
        !             9: */
        !            10: 
        !            11: struct stentry *hashtab[MAXEFLNAMES+1];
        !            12: struct stentry **hashend       = hashtab+MAXEFLNAMES+1;
        !            13: 
        !            14: #define NEXT(x) (++x<hashend ? x : hashtab )
        !            15: 
        !            16: struct stentry *name(s,t)
        !            17: char *s;
        !            18: int t;
        !            19: {
        !            20: int hash;
        !            21: register struct stentry *p, **hp;
        !            22: char *copys();
        !            23: 
        !            24: hash = hashfunct(s);
        !            25: 
        !            26: for(hp = hashtab + hash; (p = *hp) ; hp = NEXT(hp) )
        !            27:        if(hash==p->hashval && equals(s,p->namep))
        !            28:                switch(t)
        !            29:                {
        !            30:                case -1:
        !            31:                        cfree(p->namep);
        !            32:                        cfree(p);
        !            33:                        delhash(hp);
        !            34:                        --neflnames;
        !            35:                        return(0);
        !            36: 
        !            37:                case 0:
        !            38:                case 1:
        !            39:                case 2:
        !            40:                        return(p);
        !            41: 
        !            42:                default:
        !            43:                        fatal("name: illegal argument");
        !            44:                }
        !            45: 
        !            46: /* not in table */
        !            47: switch(t)
        !            48:        {
        !            49:        case -1:
        !            50:                fatal1("cannot delete nonexistent name %s from symbol table", s);
        !            51: 
        !            52:        case 1:
        !            53:                return(0);
        !            54: 
        !            55:        case 0:
        !            56:        case 2:
        !            57:                if(++neflnames >= MAXEFLNAMES)
        !            58:                        fatal("hash table full");
        !            59: 
        !            60:                *hp = p = ALLOC(stentry);
        !            61:                p->namep = (t==0 ? copys(s) : s);
        !            62:                p->hashval = hash;
        !            63:                return(p);
        !            64: 
        !            65:        default:
        !            66:                fatal("illegal call to name");
        !            67:        } return 0;
        !            68: }
        !            69: 
        !            70: 
        !            71: 
        !            72: hashfunct(s)
        !            73: register char *s;
        !            74: {
        !            75: register int h;
        !            76: 
        !            77: h = 0;
        !            78: while(*s)
        !            79:        h += *s++;
        !            80: 
        !            81: return( h % (MAXEFLNAMES+1) );
        !            82: }
        !            83: 
        !            84: 
        !            85: delhash(hp)
        !            86: struct stentry **hp;
        !            87: {
        !            88: struct stentry **hq, **hvp;
        !            89: 
        !            90: for ( ; ; )
        !            91:        {
        !            92:        *hp = 0;
        !            93:        hq = hp;
        !            94:        for(hp = NEXT(hp) ; *hp &&
        !            95:                ( (hq < (hvp = hashtab + (*hp)->hashval) && hvp<=hp)
        !            96:                || (hp<hq && hq<hvp) || (hvp<=hp && hp<hq) ) ;
        !            97:                hp = NEXT(hp) )
        !            98:                        ;
        !            99:        if(*hp == 0)
        !           100:                return;
        !           101:        *hq = *hp;
        !           102:        }
        !           103: }
        !           104: #endif
        !           105: 
        !           106: #ifndef HASHEDTABLE
        !           107: /* Basic symbol table maintainer.  Action depends on t:
        !           108: t = -1 Remove name from table
        !           109: t =  0 Put name in table if not there.  Copy name string
        !           110: t =  1 Find name in table if there, otherwise return 0.
        !           111: t =  2 Put name in table if not there.  Do not copy name
        !           112: *!!/
        !           113: 
        !           114: struct stentry *hashtab[MAXEFLNAMES];
        !           115: struct stentry **hashend hashtab;
        !           116: 
        !           117: name(s,t)
        !           118: char *s;
        !           119: int t;
        !           120: {
        !           121: int hash;
        !           122: register struct stentry *p, **hp;
        !           123: char *copys();
        !           124: 
        !           125: hash = hashfunct(s);
        !           126: 
        !           127: for(hp = hashtab ; hp<hashend ; ++hp)
        !           128:        if( (p = *hp) && hash==p->hashval &&  equals(s,p->namep))
        !           129:                switch(t)
        !           130:                {
        !           131:                case -1:
        !           132:                        cfree(p->namep);
        !           133:                        cfree(p);
        !           134:                        *hp = 0;
        !           135:                        return(0);
        !           136: 
        !           137:                case 0:
        !           138:                case 1:
        !           139:                case 2:
        !           140:                        return(p);
        !           141: 
        !           142:                default:
        !           143:                        fatal("name: illegal argument");
        !           144:                }
        !           145: 
        !           146: /* not in table *!!/
        !           147: switch(t)
        !           148:        {
        !           149:        case -1:
        !           150:                fatal1("cannot delete nonexistent name %s from symbol table", s);
        !           151: 
        !           152:        case 1:
        !           153:                return(0);
        !           154: 
        !           155:        case 0:
        !           156:        case 2:
        !           157:                /* look for an empty slot *!!/
        !           158:                for(hp = hashtab ; hp<hashend && *hp!=0 ; ++hp)
        !           159:                        ;
        !           160: 
        !           161:                if(hp == hashend)
        !           162:                        if(++neflnames >= MAXEFLNAMES)
        !           163:                                fatal("hash table full");
        !           164:                        else ++hashend;
        !           165: 
        !           166:                *hp = p = ALLOC(stentry);
        !           167:                p->namep = (t==0 ? copys(s) : s);
        !           168:                p->hashval = hash;
        !           169:                return(p);
        !           170: 
        !           171:        default:
        !           172:                fatal("illegal call to name");
        !           173:        }
        !           174: }
        !           175: 
        !           176: 
        !           177: 
        !           178: hashfunct(s)
        !           179: register char *s;
        !           180: {
        !           181: register int h;
        !           182: 
        !           183: h = 0;
        !           184: while(*s)
        !           185:        h = *s++;
        !           186: 
        !           187: return(h);
        !           188: }
        !           189: */
        !           190: #endif

unix.superglobalmegacorp.com

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