Annotation of researchv10no/cmd/refer/update/extr.c, revision 1.1.1.1

1.1       root        1: # include "stdio.h"
                      2: # include "assert.h"
                      3: # include "ctype.h"
                      4: 
                      5: main(argc,argv)
                      6:        char *argv[];
                      7: {
                      8: /* arguments are keys of a paper */
                      9: /* output is file & lines to drop */
                     10:        char answer[200], filname[60], outname[60];
                     11:        int nuse = 0, i, c, length, line1, line2;
                     12:        long l, start;
                     13:        FILE *lkin, *lkout, *fin, *fout;
                     14:        char buff[2000], *bf = buff;
                     15:        char *select = 0;
                     16:        extern char *indexes;
                     17: lkin = fopen("/dev/null", "w");
                     18: lkout = fopen("/dev/null", "r");
                     19: _assert (lkin !=NULL); _assert (lkout!=NULL);
                     20: while (argc>1 &&argv[1][0]=='-')
                     21:        {
                     22:        switch(argv[1][1])
                     23:                {
                     24:                case 'p': /* use private index files */
                     25:                        indexes = argv[2];
                     26:                        argv += 2; argc -= 2;
                     27:                        continue;
                     28:                case 'u': /* use the Nth item */
                     29:                        nuse = atoi(argv[1]+2);
                     30:                        argv++; argc--;
                     31:                        continue;
                     32:                case 's': /* insist on a particular string */
                     33:                        select = argv[2];
                     34:                        argv += 2; argc -= 2;
                     35:                        continue;
                     36:                default:
                     37:                        fprintf(stderr, "unknown option %s\n",argv[1]);
                     38:                        argv++; argc--;
                     39:                        continue;
                     40:                }
                     41:        }
                     42: lookup(lkin, lkout);
                     43: if (argc<=1) fprintf(stderr, "No search keys\n");
                     44: _assert (argc>1);
                     45: for(i=1; i<argc; i++)
                     46:        fprintf(lkin, "%s ", argv[i]);
                     47: fprintf(lkin, "\n");
                     48: fclose(lkin);
                     49: /* skip items up to nuse */
                     50: for(i=1; i<nuse; i++)
                     51:        geta(answer, lkout, select);
                     52: /* get the right answer */
                     53: i = geta(answer, lkout, select);
                     54: if (i==0)
                     55:        {
                     56:        fprintf(stderr, "No match\n");
                     57:        exit(1);
                     58:        }
                     59: sscanf(answer, "%[^:]:%ld,%d", filname, &start, &length);
                     60: if (nuse<=0 && geta(answer, lkout, select)>0)
                     61:        {
                     62:        fprintf(stderr, "Not unique - use lookbib and either -s or -u\n");
                     63:        exit(1);
                     64:        }
                     65: fclose(lkout);
                     66: assert((strlen(filname)>0));
                     67: fin = fopen(filname, "r");
                     68: _assert (fin!=NULL);
                     69: c=0;
                     70: for(i=getpid()%990; 1; i++)
                     71:        {
                     72:        _assert (c++<100);
                     73:        sprintf(outname, "bib%03d", i);
                     74:        if (access(outname, 06) != 0)
                     75:                break;
                     76:        }
                     77: fout = fopen(outname, "w");
                     78: line1 = 1;
                     79: printf("Extracting as file %s\n", outname);
                     80: for(l=0; l<start; l++)
                     81:        {
                     82:        c = getc(fin);
                     83:        _assert (c!=EOF);
                     84:        if (c=='\n')
                     85:                line1++;
                     86:        }
                     87: line2=line1;
                     88: for(i=0; i<length; i++)
                     89:        {
                     90:        c = getc(fin);
                     91:        _assert (c != EOF);
                     92:        putchar(c);
                     93:        *bf++ = c;
                     94:        if (c== '\n')
                     95:                line2++;
                     96:        }
                     97: fclose(fin);
                     98: fprintf(fout, "%%# %s %d %d change %ld %d\n",
                     99:        filname, line1, line2-1, start, length);
                    100: *bf=0;
                    101: fprintf(fout, "%s", buff);
                    102: fclose(fout);
                    103: }
                    104: geta(answer, f, str)
                    105:        char *answer, *str;
                    106:        FILE *f;
                    107: {
                    108: answer[0]=0;
                    109: while (answer[0]==0 && feof(f)==0)
                    110:        {
                    111:        answer[0]=0;
                    112:        fgets(answer, 200, f);
                    113:        trim(answer);
                    114:        if (contain(answer, str)==0)
                    115:                answer[0]=0;
                    116:        }
                    117: return( answer[0]!=0);
                    118: }
                    119: contain(answer, str)
                    120:        char *answer, *str;
                    121: {
                    122: char filname[100]; long start; int length;
                    123: int ft;
                    124: char buff[1000], *s, *st;
                    125: if (str==0) return(1);
                    126: if (answer[0]==0) return(1);
                    127: sscanf(answer, "%[^:]:%ld,%d", filname, &start, &length);
                    128: assert((strlen(filname)>0));
                    129: ft = open(filname, 0);
                    130: assert(ft>=0);
                    131: lseek(ft, start, 0);
                    132: if (length>1000) length=1000;
                    133: length = read(ft, buff, length);
                    134: close(ft);
                    135: buff[length]=0;
                    136: st = buff+length;
                    137: for(s=buff; s<st; s++)
                    138:        if (prefix(str, s))
                    139:                return(1);
                    140: return(0);
                    141: }
                    142: prefix(sh,lg)
                    143:        char *sh, *lg;
                    144: {
                    145: int c;
                    146: while ( (c= *sh++) == *lg++)
                    147:        {
                    148:        if (c==0)
                    149:                return(1);
                    150:        }
                    151: return(c==0);
                    152: }
                    153: trim(s)
                    154:        char *s;
                    155: {
                    156: while (*s)s++;
                    157: if (*--s=='\n') *s=0;
                    158: }

unix.superglobalmegacorp.com

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