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

  1. #
  2. # include "econs.h"
  3. # include "ecmn.h"
  4. /*int    mbuf[1024];    /*INSTR*/
  5. /*int    tbuf[12];    /*INSTR*/
  6.  
  7. int    (*acts[])()    {0,
  8.             &coll,
  9.             &save,
  10.             &out,
  11.             &error,
  12.             &hyphen,
  13.             &pno
  14.             };
  15.  
  16. char    *tmp[2]    {"/tmp/crt0a",
  17.         "/tmp/crt1a"
  18.         };
  19.  
  20. char    *ignonl    "/usr/lib/eign";
  21. char    *gtab    "/usr/lib/etab";
  22.  
  23. main(argc,argv)
  24.     char    *argv[];
  25. {
  26.     auto    i,j,tm1,tm2,tm3;
  27.     char    *fn,*av[8];
  28. /*    extern    etext;    /*INSTR*/
  29.  
  30. /*    monitor(&main,&etext,&mbuf,1024);    /*INSTR*/
  31.  
  32.     if(*argv[1] == '-') {
  33.         j = flags(argv);
  34.         argv =+ j;
  35.         argc =- j;
  36.     }
  37.  
  38.     init();
  39.  
  40.     i = 0;
  41.     if(argc == 1) {
  42.         *ibuf1 = 0;
  43.         curfl = 2;
  44.         curf[0] = '_';
  45.         curf[1] = '\t';
  46.         goto pipe;
  47.     }
  48.     while(++i < argc) {
  49.         curs[4] = '\t';
  50.  
  51.         if(fopen(argv[i],ibuf1) < 0) {
  52.             printf("Can't open %s\n",argv[i]);
  53.             dexit();
  54.         }
  55.  
  56.         curfl = 0;
  57.         while((curf[curfl] = *argv[i]++) != 0 && curfl <=8)
  58.             if(curf[curfl++] == '/')    curfl = 0;
  59.         curf[curfl++] = '\t';
  60.         if(curfl == 8) curf[8] = -1;
  61.  
  62. pipe:
  63.         ibuf = ibuf1;
  64.         lno = 1;
  65.  
  66.         driver();
  67.  
  68.         close(file);
  69.     }
  70.     flsh(0);
  71.     close(tp[0]);
  72.  
  73.  
  74. /*    monitor(0);    /*INSTR*/
  75. /*    dexit();    /*INSTR*/
  76.  
  77. /*    times(tbuf);    /*INSTR*/
  78. /*    tm1 = tbuf[0]/6;    /*INSTR*/
  79. /*    tm2 = tbuf[1]/6;    /*INSTR*/
  80. /*    printf("Prep:  %d  %d\n", tm1, tm2);    /*INSTR*/
  81.  
  82. /*    exit();    /*DEBUG*/
  83.     fn = "/bin/sort";
  84.     av[0] = "sort";
  85.     av[1] = tmp[0];
  86.     av[2] = "-o";
  87.     av[3] = tmp[0];
  88.     av[4] = 0;
  89.  
  90.     callsys(fn, av);
  91.  
  92. /*    times(tbuf);    /*INSTR*/
  93. /*    tm1 = tbuf[3]/6;    /*INSTR*/
  94. /*    tm2 = tbuf[5]/6;    /*INSTR*/
  95. /*    printf("Sort:  %d  %d\n", tm1, tm2);    /*INSTR*/
  96.  
  97.     if(usw) {
  98.         fn = "/usr/bin/upost";
  99.         av[0] = "upost";
  100.         i = 0;
  101.     } else if(count) {
  102.         fn = "count";
  103.         av[0] = "count";
  104.         i = 0;
  105.     } else {
  106.         fn = "/usr/bin/crpost";
  107.         av[0] = "crpost";
  108.         av[1] = "-E";
  109.         i = 1;
  110.     }
  111.     av[++i] = tmp[0];
  112.     av[++i] = 0;
  113.  
  114.     callsys(fn,av);
  115.  
  116. /*    times(tbuf);    /*INSTR*/
  117. /*    tm1 = tbuf[3]/6 - tm1;    /*INSTR*/
  118. /*    tm2 = tbuf[5]/6 - tm2;    /*INSTR*/
  119. /*    printf("Post:  %d  %d\n", tm1, tm2);    /*INSTR*/
  120.  
  121.     dexit();
  122. }
  123.  
  124. driver()
  125. {
  126.     auto    p;
  127.  
  128. top:
  129.     l = -1;
  130.     while((c = line[++l] = getc(ibuf)) != -1) {
  131. /*    printf("driver: c = %o l = %d\n",c,l); /*DEBUG*/
  132.         if(l >= 299) {
  133.             printf("Line too long: %d.\n",lno);
  134.             dexit();
  135.         }
  136.  
  137.         if(c & 0200) {
  138.             printf("Illegal character: %o line %d\n",c,lno);
  139.             dexit();
  140.         }
  141.  
  142.         if(fl) {
  143.             if((*flag[fl])())
  144.                 continue;
  145.         }
  146.  
  147. /*printf("cs = %d cc = %c ca = %d\n",cs,c,tab[cs].cl[c]);    /*DEBUG*/
  148.  
  149.         if(p = tab[cs].cl[c])
  150.             (*acts[p])();
  151.         continue;
  152.     }
  153.     if(ibuf == ibuf1)    return;
  154.     ibuf = ibuf1;
  155.     goto top;
  156.  
  157. }
  158.  
  159. init()
  160. {
  161.     int    b[3];
  162.     auto    fi,i;
  163.     extern    coll(),save(),out(),asym(),asw(),csym(),csw();
  164.     extern    incl(),decl(),sk(),sk2();
  165.     extern    dexit();
  166.  
  167.     ibuf1 = &ib1;
  168.  
  169.  
  170.  
  171.     if((fi = open(gtab,0)) < 0) {
  172.         printf("Cannot open grammar table; see lem\n");
  173.         dexit();
  174.     }
  175.  
  176.     i = -1;
  177.     while(++i < NUMS)
  178.         if(read(fi,tab[i].cl,256) < 256) {
  179.             printf("Bad grammar table; see lem\n");
  180.             dexit();
  181.         }
  182.  
  183.     close(fi);
  184.  
  185.  
  186.  
  187.     if(signal(1,1) != 1)    signal(1,&dexit);
  188.     if(signal(2,1) != 1)    signal(2,&dexit);
  189.     if(signal(3,1) != 1)    signal(3,&dexit);
  190.     while((tp[1] = creat(tmp[1],0)) < 0)
  191.         tmp[1][9]++;
  192.     close(tp[1]);
  193.     tmp[0][9] = tmp[1][9];
  194.     tp[0] = creat(tmp[0],CREATC);
  195.  
  196.     if(count)    return;
  197.  
  198.     itab.hptr = &ipsp;
  199.     itab.symt = &issp;
  200.     itab.hsiz = PTRI;
  201.     itab.ssiz = CHARI;
  202.     itab.nsym = 0;
  203.     itab.curb = 1;
  204.  
  205.     if((fi = open(ignonl,0)) < 0) {
  206.         printf("Cannot open ignore/only file.\n");
  207.         dexit();
  208.     }
  209.     if((read(fi,b,6) == 6) && (b[0] == 0100200)) {
  210.         if(read(fi,itab.hptr,b[1]) < b[1]) {
  211.             printf("Cannot read ignore/only file.\n");
  212.             dexit();
  213.         }
  214.         if(read(fi,itab.symt,b[2]) < b[2]) {
  215.             printf("Cannot read ignor/only file.\n");
  216.             dexit();
  217.         }
  218.         close(fi);
  219.     } else {
  220.         close(fi);
  221.         compile();
  222.     }
  223.     return;
  224. }
  225.  
  226. error(a)
  227. {
  228.     printf("Error %d\n",a);
  229.     dexit();
  230. }
  231.  
  232. dexit()
  233. {
  234.     extern    nflush;
  235.  
  236. /*    printf("nflush = %d\n",nflush);    /*DEBUG*/
  237.     if(tp[0] > 0 && utmp == 0) {
  238.         unlink(tmp[0]);
  239.         unlink(tmp[1]);
  240.     }
  241.     exit();
  242. }
  243.  
  244. callsys(f,v)
  245.     char    f[],*v[];
  246. {
  247.     int    t,status,i;
  248.  
  249.     if((t = fork()) == 0) {
  250.         for(i = 1; i <= 12; i++)    signal(i,0);
  251.         execv(f,v);
  252.         printf("Can't find %s\n",f);
  253.         exit(1);
  254.     } else {
  255.         if(t == -1) {
  256.             printf("Try again\n");
  257.             return(1);
  258.         }
  259.     }
  260.  
  261.     while(t != wait(&status));
  262. /*    printf("Status = %o, %s\n",status,f);    /*DEBUG*/
  263.     if((t = (status & 0377)) != 0) {
  264.         if(t != 2) {
  265.             printf("Fatal error in %s\n",f);
  266.             printf("t = %d\n",t);
  267.         }
  268.         dexit();
  269.     }
  270.     return((status>>8) & 0377);
  271. }
  272.  
  273. flags(argv)
  274.     char    *argv[];
  275. {
  276.     int    j,xx;
  277.     char    *ap;
  278.  
  279.     j = 1;
  280.     ap = argv[1];
  281.     while(*++ap != '\0') {
  282.         switch(*ap) {
  283.  
  284.             default:
  285.                 printf("Unrecognized flag: %c\n",*ap);
  286.                 dexit();
  287.  
  288.             case 'c':
  289.                 count = 1;
  290.                 continue;
  291.  
  292.             case 'i':    /* Ignore file */
  293.                 if(!xx) {
  294.                     xx = 1;
  295.                     only = 0;
  296.                     ignonl = argv[++j];
  297.                 }
  298.                 continue;
  299.  
  300.             case 'o':    /*only file*/
  301.                 if(!xx) {
  302.                     xx = 1;
  303.                     only = 1;
  304.                     ignonl = argv[++j];
  305.                 }
  306.                 continue;
  307.  
  308.             case 'p':
  309.                 page = 1;
  310.                 continue;
  311.  
  312.             case 't':
  313.                 utmp = argv[++j];
  314.                 tmp[0] = argv[j];
  315.                 continue;
  316.  
  317.             case 'u':    /* Unique symbols only */
  318.                 usw = 1;
  319.                 continue;
  320.  
  321.             case 'w':    /* Word list only */
  322.                 word = 1;
  323.                 continue;
  324.  
  325.         }
  326.     }
  327.     return(j);
  328. }
  329.  
  330.  
  331. compile()
  332. {
  333.     char    buf[40],*b;
  334.     int    i,v;
  335.  
  336.     fopen(ignonl,ibuf1);
  337.  
  338.     b = buf - 1;
  339.     while((*++b = getc(ibuf1)) != -1) {
  340.         if(*b == '\n') {
  341.             *b = '\0';
  342.             search(buf,b - buf,&itab,1);
  343.             b = buf - 1;
  344.         } else {
  345.             if(*b == '\t') {
  346.                 v = 0;
  347.                 while((i = getc(ibuf1)) != -1) {
  348.                     if(i == '\n')    break;
  349.                     v = v*10 + (i - '0');
  350.                 }
  351.                 search(buf,b - buf,&itab,v);
  352.                 b = buf - 1;
  353.             } else {
  354.                 if((b - buf) > 39) {
  355.                     printf("Ignore/only symbol too long.\n");
  356.                     dexit();
  357.                 }
  358.             }
  359.         }
  360.     }
  361.     close(ibuf1);
  362.     return;
  363. }
  364.