|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.