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

  1. # include "stdio.h"
  2. # include "assert.h"
  3. extern char refdir[];
  4. extern int keepold;
  5. extern char *fgnames[];
  6. extern char **fgnamp;
  7. FILE *fd 0;
  8. int lmaster 500;
  9. int *hfreq, hfrflg;
  10. int colevel 0;
  11. int soutlen 1000;
  12. int reached 0;
  13. int iflong 0;
  14. int prfreqs 0;
  15. char usedir[100];
  16. char gfile[50];
  17. static int full 1000;
  18. static int tags 0;
  19. char *sinput, *soutput, *tagout;
  20. long indexdate 0, gdate();
  21.  
  22. main(argc,argv)
  23.     char *argv[];
  24. {
  25. /* read query from stdin, expect name of indexes in argv[1] */
  26. static FILE *fa, *fb, *fc;
  27. char nma[100], nmb[100], nmc[100], *qitem[100], *rprog 0;
  28. char nmd[100], grepquery[256];
  29. static char oldname[30] ;
  30. static int was 0;
  31. /* these pointers are unions of pointer to int and pointer to long */
  32. long *hpt;
  33. unsigned *master 0;
  34. int falseflg, nhash, nitem, nfound, frtbl, kk;
  35.  
  36.     /* special wart for refpart: default is tags only */
  37.  
  38. while (argv[1][0] == '-')
  39.     {
  40.     switch(argv[1][1])
  41.         {
  42.         case 'a': /* all output, incl. false drops */
  43.             falseflg = 1; break;
  44.         case 'r':
  45.             argc--; argv++;
  46.             rprog = argv[1];
  47.             break;
  48.         case 'F': /* put out full text */
  49.             full = setfrom(argv[1][2]);
  50.             break;
  51.         case 'T': /* put out tags */
  52.             tags = setfrom(argv[1][2]);
  53.             break;
  54.         case 'i': /* input in argument string */
  55.             argc--; argv++;
  56.             sinput = argv[1];
  57.             break;
  58.         case 's': /*text output to string */
  59.         case 'o':
  60.             argc--; argv++;
  61.             soutput = argv[1];
  62.             if (argv[2]<16000)
  63.                 {
  64.                 soutlen = argv[2];
  65.                 argc--; argv++;
  66.                 }
  67.             break;
  68.         case 't': /*tag output to string */
  69.             argc--; argv++;
  70.             tagout = argv[1];
  71.             break;
  72.         case 'l': /* length of internal lists */
  73.             argc--; argv++;
  74.             lmaster = atoi(argv[1]);
  75.             break;
  76.         case 'g': /* suppress fgrep search on old files */
  77.             keepold = 0;
  78.             break;
  79.         case 'C': /* coordination level */
  80.             colevel = atoi(argv[1]+2);
  81. # if D1
  82. fprintf(stderr, "colevel set to %d\n",colevel);
  83. # endif
  84.             break;
  85.         case 'P': /* print term freqs */
  86.             prfreqs=1; break;
  87.         }
  88.     argc--; argv++;
  89.     }
  90. strcpy (nma, todir(argv[1]));
  91. if (was == 0 || strcmp (oldname, nma) !=0)
  92.     {
  93.     strcpy (oldname,nma);
  94.     strcpy (nmb, nma); strcpy (nmc, nmb); strcpy(nmd,nma);
  95.     strcat (nma, ".ia");
  96.     strcat (nmb, ".ib");
  97.     strcat (nmc, ".ic");
  98.     strcat (nmd, ".id");
  99.     if (was)
  100.         {fclose(fa); fclose(fb); fclose(fc);}
  101.  
  102.     fa = fopen(nma, "r");
  103.     if (fa==NULL)
  104.         {
  105.         err("No files %s",nma);
  106.         exit(1);
  107.         }
  108.     fb = fopen(nmb, "r");
  109.     fc = fopen(nmc, "r");
  110.     was =1;
  111.     if (fb== NULL || fc ==NULL)
  112.         {
  113.         err("Index incomplete %s", nmb);
  114.         exit(1);
  115.         }
  116.     indexdate = gdate(fb);
  117.     fd = fopen(nmd, "r");
  118.     }
  119. fseek (fa, 0L, 0);
  120. fread (&nhash, sizeof(nhash), 1, fa);
  121. fread (&iflong, sizeof(iflong), 1, fa);
  122. if(master==0)
  123. master = calloc (lmaster, iflong? 4: 2);
  124. hpt = calloc(nhash, sizeof(*hpt));
  125. kk=fread( hpt, sizeof(*hpt), nhash, fa);
  126. # if D1
  127. fprintf(stderr,"read %d hashes, iflong %d, nhash %d\n", kk, iflong, nhash);
  128. # endif
  129. _assert (kk==nhash);
  130. hfreq = calloc(nhash, sizeof(*hfreq));
  131. _assert (hfreq != NULL);
  132. frtbl = fread(hfreq, sizeof(*hfreq), nhash, fa);
  133. hfrflg = (frtbl == nhash);
  134. # if D1
  135. fprintf(stderr, "read freqs %d\n", frtbl);
  136. # endif
  137.  
  138. while (1)
  139.     {
  140.     nitem = getq(qitem);
  141.     if (nitem==0) continue;
  142.     if (nitem < 0) break;
  143.     nfound = doquery(hpt, nhash, fb, nitem, qitem, master);
  144. # if D1
  145.     fprintf(stderr,"after doquery nfound %d\n", nfound);
  146. # endif
  147.     fgnamp=fgnames;
  148.     if (falseflg == 0)
  149.         nfound = baddrop(master, nfound, fc, nitem, qitem, rprog, full);
  150. # if D1
  151.     fprintf(stderr,"after baddrop nfound %d\n", nfound);
  152. # endif
  153.     if (fgnamp>fgnames)
  154.         {
  155.         char **fgp, tgbuff[100];
  156.         int k;
  157. # if D1
  158.         fprintf(stderr, "were %d bad files\n", fgnamp-fgnames);
  159. # endif
  160.         grepquery[0]=0;
  161.         for(k=0; k<nitem; k++)
  162.             {
  163.             strcat(grepquery, " ");
  164.             strcat(grepquery, qitem[k]);
  165.             }
  166. # if D1
  167.         fprintf(stderr, "grepquery %s\n",grepquery);
  168. # endif
  169.         for(fgp=fgnames; fgp<fgnamp; fgp++)
  170.             {
  171. # if D1
  172.             fprintf(stderr, "Now on %s query /%s/\n", *fgp, grepquery);
  173. # endif
  174.             makefgrep(*fgp);
  175. # if D1
  176.             fprintf(stderr, "grepmade\n");
  177. # endif
  178.             if (tagout==0)
  179.                 tagout=tgbuff;
  180.             grepcall(grepquery, tagout, *fgp);
  181. # if D1
  182.             fprintf(stderr, "tagout now /%s/\n", tagout);
  183. # endif
  184.             if (full)
  185.                 {
  186.                 char bout[1000];
  187.                 findline(tagout, bout, 1000);
  188.                 fputs(bout,stdout);
  189.                 }
  190.             }
  191.         }
  192.     if (tags)
  193.         result (master, nfound >tags ? tags: nfound, fc);
  194.     }
  195. }
  196.  
  197. todir(t)
  198.     char *t;
  199. {
  200.     char *s;
  201.     s=t;
  202.     while (*s) s++;
  203.     while (s>=t && *s != '/') s--;
  204.     if (s<t) return(t);
  205. *s++ = 0;
  206. t = (*t ? t : "/");
  207. chdir (t);
  208. strcpy (usedir,t);
  209. return(s);
  210. }
  211. setfrom(c)
  212. {
  213. switch(c)
  214.     {
  215.     case 'y': case '\0':
  216.     default:
  217.         return(1000);
  218.     case '1':
  219.     case '2': case '3': case '4': case '5':
  220.     case '6': case '7': case '8': case '9':
  221.         return(c-'0');
  222.     case 'n': case '0':
  223.         return(0);
  224.     }
  225. }
  226.