Annotation of 40BSD/cmd/refer/hunt1.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.