Annotation of 43BSDReno/contrib/bib/src/invert.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)invert.c   2.6     3/5/87";
        !             3: #endif not lint
        !             4: #
        !             5: /*  input:  records of lines, separated by blank lines
        !             6:     output: key:file1 start/length ... start/length:file2 start/length ...
        !             7: */
        !             8: 
        !             9: # include "stdio.h"
        !            10: # include "streams.h"
        !            11: # include "bib.h"
        !            12: # define isnull(x)  (*(x) == NULL)
        !            13: # define makelow(c) ('A'<=(c) && (c)<='Z' ? (c)-'A'+'a' : c)
        !            14: 
        !            15: int     max_kcnt = 100;     /*  max number of keys                      */
        !            16: int     max_klen =   6;     /*  max length of keys                      */
        !            17: char    *ignore =           /*  string of line starts to ignore         */
        !            18:             "CNOPVX";
        !            19: char    *common =           /*  name of file of common words            */
        !            20:             COMFILE;
        !            21: char    *INDEX=             /*  name of output file                     */
        !            22:             INDXFILE;
        !            23: 
        !            24: char    *bibtmpfile =          /*  name of temporary file                  */
        !            25:             INVTEMPFILE;
        !            26: 
        !            27: int    silent = 0;         /*  0 => statistics printed                 */
        !            28:                            /*  1 => no statisitics printed             */
        !            29: 
        !            30: char *sort_it =
        !            31:         "sort -u +0 -1 +1 -2 +2n -3 +3n %s -o %s";
        !            32: char sortcmd[maxstr];
        !            33: 
        !            34: int     argc;
        !            35: char    **argv;
        !            36: 
        !            37: main(argcount,arglist)
        !            38: int argcount;
        !            39: char **arglist;
        !            40: {   char            *filename;
        !            41:     FILE            *input, *output;
        !            42:     long int        start,length;
        !            43:     char            word[maxstr];
        !            44:     int             kcnt;
        !            45:     char            tag_line[maxstr];
        !            46: 
        !            47:     long int       records = 0;  /*  number of records read           */
        !            48:     long int       keys    = 0;  /*  number of keys read (occurences) */
        !            49:     long int       distinct;     /*  number of distinct keys          */
        !            50:     long int       shorten();
        !            51: 
        !            52:     strcpy(COMFILE, N_COMFILE);
        !            53:     strcpy(BMACLIB, N_BMACLIB);
        !            54: 
        !            55:     argc= argcount-1;
        !            56:     argv= arglist+1;
        !            57:     mktemp(bibtmpfile);
        !            58:     output= fopen(bibtmpfile,"w");
        !            59: 
        !            60:     for ( flags() ; argc>0 ; argc--, argv++ ,flags() )
        !            61:     {   /* open input file              */
        !            62:             filename=   *argv;
        !            63:             input=      fopen(filename,"r");
        !            64:             if (input==NULL)
        !            65:             {   fprintf(stderr, "invert: error in open of %s\n", filename);
        !            66:                 continue;
        !            67:             }
        !            68:             start=      0L;
        !            69:             length=     0L;
        !            70: 
        !            71:         for(;;) /* each record  */
        !            72:         {   /* find start of next record (exit if none)     */
        !            73:                 start= nextrecord(input,start+length);
        !            74:                 if (start==EOF)   break;
        !            75:             records++;
        !            76:            kcnt= 0;
        !            77:             length= recsize(input,start);
        !            78:             sprintf(tag_line, " %s %d %d\n", filename, start, length);
        !            79: 
        !            80:             while (ftell(input) < start+length && kcnt < max_kcnt)
        !            81:             {   getword(input,word,ignore);
        !            82:                 makekey(word,max_klen,common);
        !            83:                 if (!isnull(word))
        !            84:                 {   fputs(word,output); fputs(tag_line,output);
        !            85:                     kcnt++; keys++;
        !            86:                 }
        !            87:             }
        !            88:         }
        !            89:         fclose(input);
        !            90:     }
        !            91:     fclose(output);
        !            92: 
        !            93:     sprintf(sortcmd, sort_it, bibtmpfile, bibtmpfile);
        !            94:     system(sortcmd);
        !            95: 
        !            96:     distinct = shorten(bibtmpfile,INDEX);
        !            97:     if( silent == 0 )
        !            98:        fprintf(stderr,
        !            99:            "%d documents   %d distinct keys  %d key occurrences\n",
        !           100:            records, distinct, keys);
        !           101:     exit(0);
        !           102: }
        !           103: 
        !           104: 
        !           105: 
        !           106: /*  Flag    Meaning                             Default
        !           107:     -ki     Keys per record                     100
        !           108:     -li     max Length of keys                  6
        !           109:     -%str   ignore lines that begin with %x     CNOPVX
        !           110:             where x is in str
        !           111:             str is a seq of chars
        !           112:     -cfile  file contains Common words          /usr/new/lib/bib/common
        !           113:             do not use common words as keys
        !           114:     -pfile  name of output file                 INDEX
        !           115:     -s     do not print statistics             statistics printed
        !           116: */
        !           117: 
        !           118: # define    operand     (strlen(*argv+2)==0 ? (argv++,argc--,*argv) : *argv+2)
        !           119: 
        !           120: flags()
        !           121: {
        !           122:     char *p;
        !           123:     for (; argc>0 && *argv[0]=='-';  argc--,argv++)
        !           124:     {   switch ((*argv)[1])
        !           125:         {   case 'k':   max_kcnt= atoi(operand);
        !           126:                         break;
        !           127:             case 'l':   max_klen= atoi(operand);
        !           128:                         break;
        !           129:             case 'c':   common=  operand;
        !           130:                         break;
        !           131:             case '%':   ignore=  *argv+2;
        !           132:                         break;
        !           133:             case 'p':   INDEX=  operand;
        !           134:                         break;
        !           135:            case 's':   silent= 1;
        !           136:                        break;
        !           137:            case 'd':
        !           138:                p = &argv[0][2];
        !           139:                if (!p) { 
        !           140:                        argv++;
        !           141:                        p = &argv[0][0];
        !           142:                }
        !           143:                strreplace(COMFILE, BMACLIB, p);
        !           144:                strcpy(BMACLIB, p);
        !           145:                break;
        !           146:             default:    fprintf(stderr, "unknown flag '%s'\n", *argv);
        !           147:         }
        !           148:     }
        !           149: }
        !           150: 
        !           151: 
        !           152: /*  shorten(inf,outf): file "inf" consists of lines of the form:
        !           153:         key file start length
        !           154:     sorted by key and file.  replace lines with the same key
        !           155:     with one line of the form:
        !           156:         key:file1 start/length ... start/length:file2 start/length ...
        !           157:     rename as file "outf"
        !           158:     returns number of lines in output
        !           159: */
        !           160: long shorten(inf,outf)
        !           161: char *inf, *outf;
        !           162: {   FILE *in, *out;
        !           163:     char line[maxstr];
        !           164:     char key[maxstr],  newkey[maxstr],
        !           165:          file[maxstr], newfile[maxstr];
        !           166:     long int start, length;
        !           167:     long int lines = 0;
        !           168: 
        !           169:     in=  fopen(inf, "r");
        !           170:     out= fopen(outf, "w");
        !           171:     if (in==NULL || out==NULL)
        !           172:     {   fprintf(stderr, "invert: error in opening file for compression\n");
        !           173:         return(0);
        !           174:     }
        !           175: 
        !           176:     getline(in,line);
        !           177:     sscanf(line,"%s%s%d%d", key, file, &start, &length);
        !           178:     fprintf(out, "%s :%s %d/%d", key, file, start, length);
        !           179:     for ( getline(in, line) ; !feof(in);  getline(in, line))
        !           180:     {   sscanf(line,"%s%s%d%d", newkey, newfile, &start, &length);
        !           181:         if (strcmp(key,newkey)!=0)
        !           182:         {   strcpy(key, newkey);
        !           183:             strcpy(file, newfile);
        !           184:             fprintf(out, "\n%s :%s %d/%d",  key, file, start, length);
        !           185:            lines++;
        !           186:         }
        !           187:         else if (strcmp(file,newfile)!=0)
        !           188:         {   strcpy(file,newfile);
        !           189:             fprintf(out, ":%s %d/%d", file, start, length);
        !           190:         }
        !           191:         else
        !           192:             fprintf(out, " %d/%d", start, length);
        !           193:     }
        !           194:     fprintf(out, "\n");
        !           195:     lines++;
        !           196: 
        !           197:     fclose(in); fclose(out);
        !           198:     unlink(inf);
        !           199:     return (lines);
        !           200: }

unix.superglobalmegacorp.com

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