# 2.11BSD#431 - /usr/src/usr.bin/struct/1.hash.c

##### Functions

    addref            X
    clear             X
    connect           X
    fixvalue          X
    hash              X
    hash_check        X
    hash_free         X
    hash_init         X
    parse             X

##### Variables

    chain             X
    hashtab           X
    value             X

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

#### Defined functions

addref defined in line 147; used 4 times

- in /usr/src/usr.bin/struct/1.node.c line 25
- in /usr/src/usr.bin/struct/1.recog.c line 170, 193, 301

clear defined in line 232; used 4 times

- in line 228
- in /usr/src/usr.bin/struct/1.node.c line 50
- in /usr/src/usr.bin/struct/1.recog.c line 74, 281

connect defined in line 201; used 3 times

- in /usr/src/usr.bin/struct/1.recog.c line 53-54(2), 274

fixvalue defined in line 169; used 8 times

- in line 208
- in /usr/src/usr.bin/struct/1.node.c line 49-51(2)
- in /usr/src/usr.bin/struct/1.recog.c line 73-75(2), 89, 279-280(2)

hash defined in line 129; used 8 times

- in line 134, 152, 174, 205, 218, 224-226(2), 236

hash_check defined in line 108; used 1 times

- in /usr/src/usr.bin/struct/1.main.c line 13

hash_free defined in line 120; used 1 times

- in /usr/src/usr.bin/struct/1.main.c line 14

hash_init defined in line 93; used 1 times

- in line 22

parse defined in line 18; used 1 times

- in /usr/src/usr.bin/struct/1.main.c line 11

#### Defined variables

chain defined in line 13; used 15 times

- in line 97(2), 103, 124-125(3), 156, 162-166(3), 188, 208-218(3), 238

hashtab defined in line 12; used 12 times

- in line 96-101(3), 112-115(2), 122-123(3), 140-143(3), 239

sccsid defined in line 2; never used
value defined in line 13; used 18 times

- in line 98-102(3), 112, 126-127(3), 154, 179, 196-197(2), 207, 221-226(5), 237

Last modified: 1993-01-18 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 834 |