Annotation of 3BSD/cmd/struct/1.hash.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include "1.incl.h"
        !             3: #include "1.defs.h"
        !             4: #include"def.h"
        !             5: 
        !             6: extern int match[], symclass[],  action[], newstate[];
        !             7: extern char symbol[];
        !             8: long *hashtab;
        !             9: int *value, *chain;
        !            10: 
        !            11: extern FILE *infd;
        !            12: 
        !            13: 
        !            14: parse()
        !            15:        {int i,j,found,current, someread;
        !            16:        char c;
        !            17: 
        !            18:        hash_init();
        !            19:        routinit();
        !            20:        line_init();
        !            21: 
        !            22:        someread = 0;                   /* indicates haven't read part of a routine */
        !            23: 
        !            24:        empseek(0);
        !            25:        endbuf = getline(&endline, &endchar, &endcom, & comchar);
        !            26:        if (progress && endbuf != -1) fprintf(stderr,"parsing\n");
        !            27:        while(endbuf != -1)                     /* getline returns -1 when no more input */
        !            28:                {
        !            29:                someread = 1;
        !            30:                if (progress > 0)
        !            31:                        {
        !            32:                        for (i = begline; i <= endline; i++)
        !            33:                                if (!(i % progress)) fprintf(stderr,"parsing line %d\n",i);
        !            34:                        }
        !            35:                current = 0;
        !            36:                for (i = 0; i < endbuf; i++)
        !            37:                        {
        !            38: 
        !            39:                        c = buffer[i];
        !            40:                        if(c != '~') 
        !            41:                                {
        !            42:                                found = 0;
        !            43:                                if ( (current < 0 || current >= snum) && current != ABORT)
        !            44:                                        {
        !            45:                                        strerr("in parsing:","","");
        !            46:                                        fprintf(stderr,"line %d of file, parser in invalid state", begline,current);
        !            47:                                        fprintf(stderr,"treating it as straight line code\n");
        !            48:                                        current = ABORT;
        !            49:                                        }
        !            50:                                else
        !            51:                                        for (j = match[current];  j < match[current + 1]; j++)
        !            52:                                                {
        !            53:                                                if ((symclass[j] == 0 && c == symbol[j]) ||
        !            54:                                                    (symclass[j] != 0 && classmatch(c,symclass[j]) ))
        !            55:                                                        {found = 1;  break;
        !            56:                                                        }
        !            57:                                                }
        !            58:                                if (!found)
        !            59:                                        {
        !            60:                                        error("in syntax:","","");
        !            61:                                        fprintf(stderr,"between lines %d and %d of file\n",begline, endline);
        !            62:                                        if (debug)
        !            63:                                        fprintf(stderr,"symbol '%c' does not match entries for state %d\n",c,current);
        !            64:                                        fprintf(stderr,"treating it as straight line code\n");
        !            65:                                        current = ABORT;
        !            66:                                        }
        !            67:                                else if (!action[j])  
        !            68:                                        current = newstate[j];
        !            69:                                else
        !            70:                                        {
        !            71:                                        current = act(action[j],c,i);
        !            72:                                        if (current == nulls)  current = newstate[j];
        !            73:                                        }
        !            74:                                if (current == ABORT)  break;
        !            75:                                if (current == endrt)
        !            76:                                        {
        !            77:                                        return(1);
        !            78:                                        }
        !            79:                                }
        !            80:                        }
        !            81:                line_init();
        !            82:                endbuf = getline(&endline, &endchar, &endcom,&comchar);
        !            83:                }
        !            84:        if (someread) return(1);
        !            85:        else return(0);
        !            86:        }
        !            87: 
        !            88: 
        !            89: hash_init()
        !            90:        {
        !            91:        int i;
        !            92:        hashtab = challoc(sizeof(*hashtab) * maxhash);
        !            93:        chain = challoc(sizeof(*chain) * maxhash);
        !            94:        value = challoc(sizeof(*value) * maxhash);
        !            95:        for (i = 0; i < maxhash; i++)
        !            96:                {
        !            97:                hashtab[i] = -1L;
        !            98:                value[i] = -2;
        !            99:                chain[i] = 0;
        !           100:                }
        !           101:        }
        !           102: 
        !           103: 
        !           104: hash_check()
        !           105:        {
        !           106:        int i;
        !           107:        for (i = 0; i < maxhash; ++i)
        !           108:                if (value[i] == -2 && hashtab[i] != -1L)
        !           109:                        {
        !           110:                        error("in syntax; label used but does not appear as statement label:","","");
        !           111:                        fprintf(stderr,"%D\n",hashtab[i]);
        !           112:                        routerr = 1;
        !           113:                        }
        !           114:        }
        !           115: 
        !           116: hash_free()
        !           117:        {
        !           118:        chfree(hashtab,sizeof(*hashtab) * maxhash);
        !           119:        hashtab = 0;
        !           120:        chfree(chain,sizeof(*chain) * maxhash);
        !           121:        chain = 0;
        !           122:        chfree(value,sizeof(*value) * maxhash);
        !           123:        value = 0;
        !           124:        }
        !           125: hash(x)
        !           126: long x;
        !           127:        {
        !           128:        int quo, rem, hcount, temp;
        !           129: 
        !           130:        ASSERT(x >= 0L, hash);
        !           131:        quo = x/maxhash;
        !           132:        rem = x - (quo * maxhash);
        !           133:        if (quo == 0)  quo = 1;
        !           134: 
        !           135:        temp = rem;
        !           136:        for (hcount=0; (hashtab[temp] != -1L) && (hashtab[temp] != x) && (hcount<maxhash); hcount++)
        !           137:                temp = (temp + quo)%maxhash;
        !           138:        if(hcount>=maxhash) faterr("hash table overflow - too many labels","","");
        !           139:        hashtab[temp] = x;
        !           140:        return(temp);
        !           141:        }
        !           142: 
        !           143: addref(x,ptr)                          /* put ptr in chain for x or assign value of x to *ptr */
        !           144: long x;
        !           145: int *ptr;
        !           146:        {
        !           147:        int index;
        !           148:        index = hash(x);
        !           149: 
        !           150:        if (value[index]  == -1)
        !           151:                {                       /* x already assigned value */
        !           152:                *ptr = chain[index];
        !           153:                return;
        !           154:                }
        !           155:        
        !           156:        /* add ptr to chain */
        !           157:        
        !           158:        if (chain[index] == 0)
        !           159:                *ptr = 0;
        !           160:        else
        !           161:                *ptr = chain[index];
        !           162:        chain[index] = ptr;
        !           163:        }
        !           164: 
        !           165: fixvalue (x,ptr)
        !           166: long x;
        !           167: int ptr;
        !           168:        {
        !           169:        int *temp1, *temp2, index, temp0;
        !           170:        index = hash(x);
        !           171: 
        !           172:        while (index != -2)
        !           173:                {                       /* trace chain of linked labels */
        !           174: 
        !           175:                if (value[index]  == -1)
        !           176:                        {
        !           177:                        error("in syntax:  ","","");
        !           178:                        fprintf(stderr,"attempt to redefine value of label %D between lines %d and %d\n",
        !           179:                                x,begline,endline);
        !           180:                        routerr = 1;
        !           181:                        return;
        !           182:                        }
        !           183:        
        !           184:                temp1 = &chain[index];          /* trace chain for each label */
        !           185:                while (temp1 != 0)
        !           186:                        {
        !           187:                        temp2 = *temp1;
        !           188:                        *temp1 = ptr;
        !           189:                        temp1 = temp2;
        !           190:                        }
        !           191:                temp0 = index;
        !           192:                index = value[index];
        !           193:                value[temp0] = -1;
        !           194:                }
        !           195:        }
        !           196: 
        !           197: connect(x,y)
        !           198: long x,y;
        !           199:        {
        !           200:        int *temp, index, temp2;
        !           201:        index = hash(x);
        !           202: 
        !           203:        if (value[index] == -1)
        !           204:                fixvalue(y, chain[index]);
        !           205:        else
        !           206:                {
        !           207:                if (y == implicit)
        !           208:                {               /* attach implicit chain to x chain */
        !           209:                temp = &chain[index];
        !           210:        
        !           211:                while (*temp != 0)
        !           212:                        temp = *temp;
        !           213:        
        !           214:                *temp = chain[hash(y)];
        !           215:                }
        !           216:                temp2 = index;          /* attach y linked labels to x linked labels */
        !           217:                while (value[temp2] >= 0)
        !           218:                        temp2 = value[temp2];
        !           219:                if (y == implicit)
        !           220:                        value[temp2] = value[hash(y)];
        !           221:                else
        !           222:                        value[temp2] = hash(y);
        !           223:                }
        !           224:        if (y == implicit)  clear(y);
        !           225:        }
        !           226:        
        !           227:        
        !           228: clear(x)
        !           229: long x;
        !           230:        {
        !           231:        int index;
        !           232:        index = hash(x);
        !           233:        value[index] = -2;
        !           234:        chain[index] = 0;
        !           235:        hashtab[index] = -1L;
        !           236:        }
        !           237: 
        !           238: 

unix.superglobalmegacorp.com

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