home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V6 / usr / source / cref / index / ind1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1975-05-13  |  3.6 KB  |  260 lines

  1. #
  2. # include "econs.h"
  3. # include "ecmn.h"
  4. # define SKIP 0
  5. # define COLLECT 1
  6. # define SKIP2 2
  7.  
  8. char    mone    -1;
  9. int    tlno    1;
  10.  
  11. coll()
  12. {
  13.     cs = COLLECT;
  14.     temp[t1].beg = &line[l];
  15.     return;
  16. }
  17.  
  18. save()
  19. {
  20.     extern    only;
  21.     char    *pt1,*pt2,cbuf[30];
  22.     int    a,tt,val;
  23.  
  24.     cs = SKIP;
  25.     line[l] = '\0';
  26.     temp[t1].ct = &line[l] - temp[t1].beg;
  27.     if(!count)
  28.         if(temp[t1].ct == 1)    goto no;
  29.     pt1 = temp[t1].beg-1;
  30.     pt2 = cbuf-1;
  31.  
  32.     while(*++pt2 = *++pt1)
  33.         if(*pt2 >= 'A' && *pt2 <= 'Z')
  34.             *pt2 =| 040;
  35.  
  36.     if(count)
  37.         goto yes;
  38.     val = search(cbuf,temp[t1].ct,&itab,0);
  39.  
  40.     if(!val == !only)    goto yes;
  41. no:
  42.     line[l] = c;
  43.     return(0);
  44. yes:
  45.     if(count == 0) {
  46.         tt = t1;
  47.         while(tt)
  48.             if(comp(temp[t1].beg,temp[--tt].beg))    goto no;
  49.     }
  50.     temp[t1++].term = c;
  51.     return(1);
  52. }
  53.  
  54. out()
  55. {
  56.     auto    i,ct,t2;
  57.     char    *b,*e;
  58.     if(cs == COLLECT)    save();
  59.     ct = t1;
  60.     while(ct--)
  61.         temp[ct].beg[temp[ct].ct] = temp[ct].term;
  62.     t2 = t1 - 1;
  63.     while(t1--) {
  64. /*printf("t1 = %d  beg = %o  ct = %d\n",t1,temp[t1].beg,temp[t1].ct); /* DEBUG */
  65.         if((ct = temp[t1].ct) >= 15) {
  66.             ct = 15;
  67.         }
  68.         put(temp[t1].beg,ct);
  69.         if(count) {
  70.             put("\n", 1);
  71.             continue;
  72.         }
  73.  
  74.         put("\t",1);
  75.  
  76.         if(!page) {
  77.             put(curf,curfl);
  78.             conf(lno,4,curs);
  79.             put(curs,4);
  80.         } else {
  81.             conf(pn,4,curs);
  82.             put(curs,4);
  83.         }
  84.         if(word == 0) {
  85.             put("\t",1);
  86.             if(t1 >= 1)
  87.                 b = temp[t1-1].beg;
  88.             else
  89.                 b =  line;
  90.             if(t2 > t1)
  91.                 e = temp[t1+1].beg + temp[t1+1].ct;
  92.             else
  93.             e = &line[l];
  94. /*printf("e = %o    b = %o\n",e,b);    /*DEBUG*/
  95.             put(b,e-b);
  96.         }
  97.         put("\n",1);
  98.     }
  99.     t1 = 0;
  100.     l = -1;
  101.     lno =+ tlno;
  102.     tlno = 1;
  103.     cs = SKIP;
  104.     return;
  105. }
  106.  
  107.  
  108. search(symbol,length,params,install)
  109.     char    *symbol;
  110.     int    length;
  111.     struct    htab    *params;
  112.     int    install;
  113. {
  114.     char    *sp,*p;
  115.     static    int    *hptr,hsiz,nsym;
  116.     static    char    *ssiz;
  117.     static    int    curb;
  118.     static    char    *symt;
  119.     auto    h,i,j,k;
  120.  
  121.     if(hptr != params->hptr) {
  122.         hptr = params->hptr;
  123.         hsiz = params->hsiz;
  124.         symt = params->symt;
  125.         ssiz = params->ssiz;
  126.         curb = params->curb;
  127.         nsym = params->nsym;
  128.     }
  129.  
  130.     symbol[length] = '\0';
  131. /*printf("ssiz = %d; nsym = %d; %s\n", ssiz, nsym, symbol);/*DEBUG*/
  132.     sp = symbol;
  133.  
  134.     i = length;
  135.     h = 1;
  136.     while(i--)
  137.         h =* *sp++;
  138.  
  139.     if(h == 0100000) {
  140.         h = 1;
  141.     } else {
  142.         h = h<0?(-h)%hsiz:h%hsiz;
  143.     }
  144.     if(h == 0)    h++;
  145. /*        printf("%s %d\n",symbol,h);    /*DEBUG*/
  146.  
  147.     while((p = &symt[hptr[h]]) > symt) {
  148.         j = length + 2;
  149.         sp = symbol;
  150.         while(--j) {
  151.             if(*p++ != *sp++)    goto no;
  152.         }
  153.         return(*p);
  154. no:
  155.         h = (h + h)%hsiz;
  156.     }
  157.     if(install) {
  158.         if(++nsym >= hsiz) {
  159.             printf("Too many symbols in ignore/only file.\n");
  160.             dexit();
  161.         }
  162.  
  163.         hptr[h] = curb;
  164.         length++;
  165.         if((curb + length) >= ssiz) {
  166.             printf("i/o file too big; ssiz = %d\n", ssiz);
  167.             dexit();
  168.         }
  169.  
  170.         while(length--)
  171.             symt[curb++] = *symbol++;
  172.         symt[curb++] = install;
  173.         params->curb = curb;
  174.         params->nsym = nsym;
  175.     }
  176.     return(0);
  177. }
  178.  
  179. conf(n,width,buf) 
  180.     char    *buf;
  181. {
  182.     auto    i,a;
  183.  
  184.     i = width;
  185.     while(i--)    buf[i] = ' ';
  186.  
  187.     buf[(a = n/10)?conf(a,--width,buf):--width] = n%10 + '0';
  188.  
  189.     return(++width);
  190. }
  191.  
  192. comp(a,b)
  193.     char    *a;
  194.     char    *b;
  195. {
  196.     a--;
  197.     b--;
  198.     while(*++a == *++b)
  199.         if(*a == '\0')    return(1);
  200.     return(0);
  201. }
  202.  
  203.  
  204. hyphen()
  205. {
  206. /*    printf("hyphen\n");    /*DEBUG*/
  207.     if(gch[fl] == 0)
  208.         flag[++fl] = &hyp1;
  209.     return(1);
  210. }
  211.  
  212. hyp1()
  213. {
  214. /*    printf("hyp1 c = %o\n",c);    /*DEBUG*/
  215.     if(c !=  '\n') {
  216.         fl--;
  217.         return(0);
  218.     } else {
  219.         l =- 2;
  220.         flag[fl] = &hyp2;
  221.         hsw = 1;
  222.         return(1);
  223.     }
  224. }
  225.  
  226. hyp2()
  227. {
  228. /*    printf("hyp2 c = %o l = %d\n",c,l);    /*DEBUG*/
  229.     if(hsw && (tab[2].cl[c] == 0)) {
  230.         l--;
  231.         if(c == 3)    pno();
  232.         if(c == '\n')    tlno++;
  233.         return(1);
  234.     }
  235.     hsw = 0;
  236.     if(tab[cs].cl[c]) {
  237.         line[l] = '\n';
  238.         out();
  239.         fl--;
  240.         return(0);
  241.     }
  242.     return(1);
  243. }
  244.  
  245. pno()
  246. {
  247.     if(flag[fl] != &pno) {
  248.         flag[++fl] = &pno;
  249.         pn = 0;
  250.         return(1);
  251.     }
  252.     if(c == '\n') {
  253.         fl--;
  254.         out();
  255.         return(1);
  256.     }
  257.     pn = pn*10 + c - '0';
  258.     return(1);
  259. }
  260.