Annotation of researchv10no/cmd/prefer/pref/invert.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * pinvert - create inverted index to a bibliographic database
                      3:  *     input:  records of lines, separated by blank lines
                      4:  *     output: key:file1 start/length ... start/length:file2 start/length ...
                      5:  */
                      6: 
                      7: #include       <signal.h>
                      8: #ifdef BSD
                      9: #include       <strings.h>
                     10: #else
                     11: #include       <string.h>
                     12: #endif
                     13: #include "stdio.h"
                     14: #include "streams.h"
                     15: #include "bib.h"
                     16: 
                     17: #define isnull(x)  (*(x) == NULL)
                     18: #define makelow(c) ('A'<=(c) && (c)<='Z' ? (c)-'A'+'a' : c)
                     19: #define INVTEMPFILE "/tmp/invertXXXXXX"                /* tmp index */
                     20: #define HEADTEMPFILE "/tmp/headXXXXXX"         /* tmp header */
                     21: 
                     22: char *strrchr(), *mktemp();
                     23: 
                     24: int     max_kcnt = 100;                /* max number of keys */
                     25: int     max_klen =   MAXKLEN;  /* max length of keys */
                     26: char   *plib = PLIB;           /* library file */
                     27: char    *common;               /* name of file of common words */
                     28: char   *ignore;                /* name of file of %xxx to ignore */
                     29: char    *tempfile = INVTEMPFILE;       /*  name of temporary file */
                     30: char    *tmphead = HEADTEMPFILE;       /*  name of temporary file for header */
                     31: char   *DINPUT = BIBFILE;      /* default input file */
                     32: char   INDEX[maxstr];          /* output index file */
                     33: char   HEAD[maxstr];           /* output header file */
                     34: int    silent = 1;             /* 0 => statistics printed */
                     35: 
                     36: char   mvcmd[maxstr];
                     37: char   path_ign[maxstr];
                     38: 
                     39: FILE   *input, *output, *head;
                     40: char   *sort_it = "sort -u %s -o %s";
                     41: char   sortcmd[maxstr];
                     42: 
                     43: char   *libpath();
                     44: int    cleanup();
                     45: 
                     46: int     argc;
                     47: char    **argv;
                     48: 
                     49: #define USAGE  "pinvert [-c common -i ignore -k nkeys -l length -p database -v] [file...]\n"
                     50: 
                     51: main(argcount,arglist)
                     52: int argcount;
                     53: char **arglist;
                     54: {
                     55:        char            *filename;
                     56:        long int        start,length;
                     57:        char            word[maxstr];
                     58:        int             kcnt;
                     59:        char            tag_line[maxstr];
                     60:        char            outstring[maxstr];
                     61:        char            lenstring[5];
                     62:        char *f;
                     63:        long int        records = 0;  /*  number of records read           */
                     64:        long int        keys    = 0;  /*  number of keys read (occurences) */
                     65:        long int        distinct;     /*  number of distinct keys          */
                     66:        long int        shorten();
                     67:        int first = 1;
                     68:        int stat;
                     69: 
                     70:        /* initialize and open files */
                     71:        argc= argcount-1;
                     72:        argv= arglist+1;
                     73:        mktemp(tempfile);
                     74:        mktemp(tmphead);
                     75:        if(signal(SIGINT, SIG_IGN) != SIG_IGN)
                     76:                signal(SIGINT, cleanup);
                     77:        signal(SIGQUIT, cleanup);
                     78:        output= fopen(tempfile,"w");
                     79:        head = fopen(tmphead,"w");
                     80: 
                     81:        /* make path names */
                     82:        common = COMFILE;
                     83:        strcpy(path_ign,libpath(plib));
                     84:        strcat(path_ign,"/");
                     85:        strcat(path_ign,IGNFILE);
                     86:        ignore = path_ign;
                     87:        INDEX[0] = NULL;
                     88:        HEAD[0] = NULL;
                     89: 
                     90:        flags();
                     91:        if(load_ign(ignore) == -1) {
                     92:                baleout();
                     93:        }
                     94: 
                     95:        /* write out name of common file and max_klen to header */
                     96:        fprintf(head,"%s %d\n",common,max_klen);
                     97: 
                     98:        /* now index input files */
                     99:        for (; argc>=0 ; argc--, argv++) {
                    100:                if(argc == 0) {
                    101:                        if(!first)
                    102:                                break;
                    103:                        else
                    104:                                filename = DINPUT;
                    105:                }
                    106:                else {
                    107:                        filename=   *argv;
                    108:                }
                    109: 
                    110:                first = 0;
                    111:                input = fopen(filename,"r");
                    112:                if (input==NULL) {
                    113:                        fprintf(stderr, "pinvert: cannot open %s\n",
                    114:                            filename);
                    115:                        baleout();
                    116:                }
                    117:                if(INDEX[0] == NULL) {
                    118:                        strcpy(INDEX,filename);
                    119:                        strcat(INDEX,".i");
                    120:                        strcpy(HEAD,filename);
                    121:                        strcat(HEAD,".h");
                    122:                }
                    123:                start=      0L;
                    124:                length=     0L;
                    125: 
                    126:                /* write out file name to header */
                    127:                if((f=strrchr(filename,'/')) != NULL)
                    128:                        f++;
                    129:                else
                    130:                        f = filename;
                    131:                fprintf(head,"%s\n",f);
                    132: 
                    133:                sprintf(lenstring,"%d",max_klen);
                    134:                strcpy(outstring,"%-");
                    135:                strcat(outstring,lenstring);
                    136:                strcat(outstring,"s%s");
                    137:                for(;;) {
                    138:                        /* find start of next record (exit if none)  */
                    139:                        start= nextrecord(input,start+length);
                    140:                        if (start==EOF)   break;
                    141:                        records++;
                    142:                        kcnt= 0;
                    143:                        length= recsize(input,start);
                    144:                        sprintf(tag_line, " %-18s %08ld %08ld\n", f, start, length);
                    145: 
                    146:                        while (ftell(input) < start+length && kcnt < max_kcnt) {
                    147:                                getword(input,word);
                    148:                                makekey(word,max_klen,common);
                    149:                                if (!isnull(word)) {
                    150:                                        fprintf(output,outstring,word,tag_line);
                    151:                                        kcnt++;
                    152:                                        keys++;
                    153:                                }
                    154:                        }
                    155:                }
                    156:                fclose(input);
                    157:        }
                    158:        fclose(output);
                    159:        fclose(head);
                    160: 
                    161:        sprintf(sortcmd, sort_it, tempfile, tempfile);
                    162:        system(sortcmd);
                    163: 
                    164:        distinct = shorten(tempfile,INDEX);
                    165:        sprintf(mvcmd,"cp %s %s\n",tmphead,HEAD);
                    166:        if(stat = system(mvcmd)) {
                    167:                unlink(tmphead);
                    168:                exit(stat);
                    169:        }
                    170:        else {
                    171:                unlink(tmphead);
                    172:        }
                    173:        if( silent == 0 )
                    174:                fprintf(stderr,
                    175:                    "%ld documents   %ld distinct keys  %ld key occurrences\n",
                    176:                    records, distinct, keys);
                    177:        exit(0);
                    178: }
                    179: 
                    180: 
                    181: baleout()
                    182: {
                    183:        unlink(tempfile);
                    184:        unlink(tmphead);
                    185:        exit(1);
                    186: }
                    187: 
                    188: /*  Flag    Meaning                             Default
                    189:     -ki     Keys per record                     100
                    190:     -li     max Length of keys                  6
                    191:     -cfile  file contains Common words          /usr/lib/prefer/common
                    192:             do not use common words as keys
                    193:     -ifile  %xxx lines in input file to ignore         /usr/lib/prefer/ignore
                    194:     -pfile  name of output file                 INDEX
                    195:     -s     do not print statistics             statistics printed
                    196: */
                    197: 
                    198: # define    operand     (strlen(*argv+2)==0 ? (argv++,argc--,*argv) : *argv+2)
                    199: 
                    200: flags()
                    201: {
                    202:        char *tmp;
                    203:        for (; argc>0 && *argv[0]=='-';  argc--,argv++) {
                    204:                switch ((*argv)[1]) {
                    205:                case 'k':
                    206:                        max_kcnt= atoi(operand);
                    207:                        break;
                    208:                case 'l':
                    209:                        max_klen= atoi(operand);
                    210:                        break;
                    211:                case 'c':
                    212:                        common=  operand;
                    213:                        break;
                    214:                case 'i':
                    215:                        ignore=  operand;
                    216:                        break;
                    217:                case 'p':
                    218:                        tmp = operand;
                    219:                        strcpy(INDEX,tmp);
                    220:                        strcat(INDEX,".i");
                    221:                        strcpy(HEAD,tmp);
                    222:                        strcat(HEAD,".h");
                    223:                        break;
                    224:                case 'v':
                    225:                        silent= 0;
                    226:                        break;
                    227:                default:
                    228:                        fprintf(stderr,USAGE);
                    229:                        baleout();
                    230:                }
                    231:        }
                    232: }
                    233: 
                    234: 
                    235: /*  shorten(inf,outf): file "inf" consists of lines of the form:
                    236:         key file start length
                    237:     sorted by key and file.  replace lines with the same key
                    238:     with one line of the form:
                    239:         key:file1 start/length ... start/length:file2 start/length ...
                    240:     rename as file "outf"
                    241:     returns number of lines in output
                    242: */
                    243: long shorten(inf,outf)
                    244: char *inf, *outf;
                    245: {
                    246:        FILE *in, *out;
                    247:        char line[maxstr];
                    248:        char key[maxstr],  newkey[maxstr],
                    249:        file[maxstr], newfile[maxstr];
                    250:        long int start, length;
                    251:        long int lines = 0;
                    252: 
                    253:        in=  fopen(inf, "r");
                    254:        out= fopen(outf, "w");
                    255:        if (in==NULL || out==NULL) {
                    256:                fprintf(stderr, "pinvert: error in opening file for compression\n");
                    257:                return(0);
                    258:        }
                    259: 
                    260:        getline(in,line);
                    261:        sscanf(line,"%s%s%ld%ld", key, file, &start, &length);
                    262:        fprintf(out, "%s :%s %ld/%ld", key, file, start, length);
                    263:        for ( getline(in, line) ; !feof(in);  getline(in, line)) {
                    264:                sscanf(line,"%s%s%ld%ld", newkey, newfile, &start, &length);
                    265:                if (strcmp(key,newkey)!=0) {
                    266:                        strcpy(key, newkey);
                    267:                        strcpy(file, newfile);
                    268:                        fprintf(out, "\n%s :%s %ld/%ld",  key, file, start, length);
                    269:                        lines++;
                    270:                }
                    271:                else if (strcmp(file,newfile)!=0) {
                    272:                        strcpy(file,newfile);
                    273:                        fprintf(out, ":%s %ld/%ld", file, start, length);
                    274:                }
                    275:                else
                    276:                        fprintf(out, " %ld/%ld", start, length);
                    277:        }
                    278:        fprintf(out, "\n");
                    279:        lines++;
                    280: 
                    281:        fclose(in);
                    282:        fclose(out);
                    283:        unlink(inf);
                    284:        return (lines);
                    285: }
                    286: 
                    287: cleanup()
                    288: {
                    289:        signal(SIGINT, SIG_IGN);
                    290:        signal(SIGQUIT, SIG_IGN);
                    291:        fclose(output);
                    292:        fclose(head);
                    293:        unlink(tempfile);
                    294:        unlink(tmphead);
                    295:        exit(1);
                    296: }

unix.superglobalmegacorp.com

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