|
|
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.