Annotation of 43BSD/usr.bin/refer/inv1.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)inv1.c      4.2 (Berkeley) 3/4/86";
                      3: #endif
                      4: 
                      5: #include <stdio.h>
                      6: #include <assert.h>
                      7: 
                      8: main(argc, argv)
                      9: char *argv[];
                     10: {
                     11:        /* Make inverted file indexes.  Reads a stream from mkey which
                     12:         * gives record pointer items and keys.  Generates set of files
                     13:         *      a. NHASH pointers to file b.
                     14:         *      b. lists of record numbers.
                     15:         *      c. record pointer items.
                     16:         *
                     17:         *  these files are named xxx.ia, xxx.ib, xxx.ic;
                     18:         *  where xxx is taken from arg1.
                     19:         *  If the files exist they are updated.
                     20:         */
                     21: 
                     22:        FILE *fa, *fb, *fc, *fta, *ftb, *ftc, *fd;
                     23:        int nhash = 256;
                     24:        int appflg = 1;
                     25:        int keepkey = 0, pipein = 0;
                     26:        char nma[100], nmb[100], nmc[100], com[100], nmd[100];
                     27:        char tmpa[20], tmpb[20], tmpc[20];
                     28:        char *remove = NULL;
                     29:        int chatty = 0, docs, hashes, fp[2], fr, fw, pfork, pwait, status;
                     30:        int i,j,k;
                     31:        long keys;
                     32:        int iflong =0;
                     33:        char *sortdir;
                     34: 
                     35:        sortdir = (access("/crp/tmp", 06)==0) ? "/crp/tmp" : "/usr/tmp";
                     36:        while (argv[1][0] == '-')
                     37:        {
                     38:                switch(argv[1][1])
                     39:                {
                     40:                case 'h': /* size of hash table */
                     41:                        nhash = atoi (argv[1]+2); 
                     42:                        break;
                     43:                case 'n': /* new, don't append */
                     44:                        appflg=0; 
                     45:                        break;
                     46:                case 'a': /* append to old file */
                     47:                        appflg=1; 
                     48:                        break;
                     49:                case 'v': /* verbose output */
                     50:                        chatty=1; 
                     51:                        break;
                     52:                case 'd': /* keep keys on file .id for check on searching */
                     53:                        keepkey=1; 
                     54:                        break;
                     55:                case 'p': /* pipe into sort (saves space, costs time)*/
                     56:                        pipein = 1; 
                     57:                        break;
                     58:                case 'i': /* input is on file, not stdin */
                     59:                        close(0);
                     60:                        if (open(argv[2], 0) != 0)
                     61:                                err("Can't read input %s", argv[2]);
                     62:                        if (argv[1][2]=='u') /* unlink */
                     63:                                remove = argv[2];
                     64:                        argc--; 
                     65:                        argv++;
                     66:                        break;
                     67:                }
                     68:                argc--;
                     69:                argv++;
                     70:        }
                     71:        strcpy (nma, argc >= 2 ? argv[1] : "Index");
                     72:        strcpy (nmb, nma);
                     73:        strcpy (nmc, nma);
                     74:        strcpy (nmd, nma);
                     75:        strcat (nma, ".ia");
                     76:        strcat (nmb, ".ib");
                     77:        strcat (nmc, ".ic");
                     78:        strcat (nmd, ".id");
                     79: 
                     80:        sprintf(tmpa, "junk%di", getpid());
                     81:        if (pipein)
                     82:        {
                     83:                pipe(fp); 
                     84:                fr=fp[0]; 
                     85:                fw=fp[1];
                     86:                if ( (pfork=fork()) == 0)
                     87:                {
                     88:                        close(fw);
                     89:                        close(0);
                     90:                        _assert(dup(fr)==0);
                     91:                        close(fr);
                     92:                        execl("/bin/sort", "sort", "-T", sortdir, "-o", tmpa, 0);
                     93:                        execl("/usr/bin/sort", "sort", "-T", sortdir, "-o", tmpa, 0);
                     94:                        _assert(0);
                     95:                }
                     96:                _assert(pfork!= -1);
                     97:                close(fr);
                     98:                fta = fopen("/dev/null", "w");
                     99:                close(fta->_file);
                    100:                fta->_file = fw;
                    101:        }
                    102:        else /* use tmp file */
                    103:        {
                    104:                fta = fopen(tmpa, "w");
                    105:                _assert (fta != NULL);
                    106:        }
                    107:        fb = 0;
                    108:        if (appflg )
                    109:        {
                    110:                if (fb = fopen(nmb, "r"))
                    111:                {
                    112:                        sprintf(tmpb, "junk%dj", getpid());
                    113:                        ftb = fopen(tmpb, "w");
                    114:                        if (ftb==NULL)
                    115:                                err("Can't get scratch file %s",tmpb);
                    116:                        nhash = recopy(ftb, fb, fopen(nma, "r"));
                    117:                        fclose(ftb);
                    118:                }
                    119:                else
                    120:                        appflg=0;
                    121:        }
                    122:        fc = fopen(nmc,  appflg ? "a" : "w");
                    123:        fd = keepkey ? fopen(nmd, "w") : 0;
                    124:        docs = newkeys(fta, stdin, fc, nhash, fd, &iflong);
                    125:        fclose(stdin);
                    126:        if (remove != NULL)
                    127:                unlink(remove);
                    128:        fclose(fta);
                    129:        if (pipein)
                    130:        {
                    131:                pwait = wait(&status);
                    132:                printf("pfork %o pwait %o status %d\n",pfork,pwait,status);
                    133:                _assert(pwait==pfork);
                    134:                _assert(status==0);
                    135:        }
                    136:        else
                    137:        {
                    138:                sprintf(com, "sort -T %s %s -o %s", sortdir, tmpa, tmpa);
                    139:                system(com);
                    140:        }
                    141:        if (appflg)
                    142:        {
                    143:                sprintf(tmpc, "junk%dk", getpid());
                    144:                sprintf(com, "mv %s %s", tmpa, tmpc);
                    145:                system(com);
                    146:                sprintf(com, "sort -T %s  -m %s %s -o %s", sortdir,
                    147:                tmpb, tmpc, tmpa);
                    148:                system(com);
                    149:        }
                    150:        fta = fopen(tmpa, "r");
                    151:        fa = fopen(nma, "w");
                    152:        fb = fopen(nmb, "w");
                    153:        whash(fta, fa, fb, nhash, iflong, &keys, &hashes);
                    154:        fclose(fta);
                    155: # ifndef D1
                    156:        unlink(tmpa);
                    157: # endif
                    158:        if (appflg)
                    159:        {
                    160:                unlink(tmpb);
                    161:                unlink(tmpc);
                    162:        }
                    163:        if (chatty)
                    164: 
                    165:                printf ("%ld key occurrences,  %d hashes, %d docs\n",
                    166:                keys, hashes, docs);
                    167: }

unix.superglobalmegacorp.com

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