home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / struct / 1.hash.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.6 KB  |  239 lines

  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.  
  239.