|
|
1.1 root 1: # include "refer..c"
2: extern FILE *in;
3: # define NFLD 30
4: # define TLEN 800
5: char one[ANSLEN];
6: int onelen = ANSLEN;
7: static char dr [100] = "";
8: doref(firline)
9: char *firline;
10: {
11: char buff[QLEN], dbuff[3*QLEN], answer[ANSLEN], temp[TLEN];
12: char line[LLINE];
13: char *p, **sr, *flds[NFLD], *r;
14: int nf, nr, alph, query = 0, chp, digs;
15:
16: /* get query */
17: buff[0] = dbuff[0] = 0;
18: if (nobracket)
19: {
20: strcpy( control(firline[0]) ? dbuff : buff , firline);
21: if (control(firline[0])) query=1;
22: firline= " ";
23: }
24: while (input(line))
25: {
26: if (prefix(".]", line))
27: break;
28: if (nobracket && line[0]=='\n')
29: break;
30: if (control(line[0])) query=1;
31: strcat (query ? dbuff: buff, line);
32: if (strlen(buff)>QLEN)
33: err("buff too big (%d)", strlen(buff));
34: assert (strlen(dbuff) <3*QLEN);
35: }
36: if (strcmp (buff, "$LIST$\n")==0)
37: {
38: # if D1
39: fprintf(stderr, "dump sorted list\n");
40: # endif
41: assert ( dbuff[0]==0);
42: dumpold();
43: return;
44: }
45: answer[0] = 0;
46: # ifdef D1
47: fprintf(stderr, "query is %s\n",buff);
48: # endif
49: for( p=buff; *p; p++)
50: {
51: if (isupper(*p)) *p |= 040;
52: }
53: alph = digs =0;
54: for(p=buff; *p; p++)
55: {
56: if (isalpha(chp = *p)) alph++;
57: else
58: if (isdigit(*p)) digs++;
59: else
60: {
61: *p=0;
62: if ( (alph+digs<3) || common(p-alph))
63: {
64: r = p-alph;
65: while (r < p)
66: *r++ = ' ';
67: }
68: if ( alph==0 && digs >0)
69: {
70: r = p-digs;
71: # if D1
72: fprintf(stderr, "number, %d long, text is %s\n",digs,r);
73: # endif
74: if (digs != 4 || (atoi(r)/100 != 19))
75: {
76: while (r<p)
77: *r++ = ' ';
78: }
79: }
80: if (chp== '\\')
81: *p++ = ' ';
82: *p=' ';
83: alph = digs = 0;
84: }
85: }
86: # ifdef D1
87: fprintf(stderr, "query translated to %s\n", buff);
88: # endif
89: one[0]=0;
90: if (buff[0]) /* do not search if no query */
91: for( sr= rdata; sr < search; sr++)
92: {
93: # ifdef D1
94: fprintf(stderr, "now searching %s\n", *sr);
95: # endif
96: temp[0]=0;
97: corout (buff, temp, "hunt", *sr, TLEN);
98: strcpy(dr, *sr);
99: dirfix(dr);
100: assert (strlen(temp)<TLEN);
101: if (strlen(temp)+strlen(answer)>LLINE)
102: err("Accumulated answers too large",0);
103: strcat (answer, temp);
104: if (strlen(answer)>LLINE)
105: err("answer too long (%d)", strlen(answer));
106: if (newline(answer) > 0) break;
107: }
108: # if D1
109: fprintf(stderr, "answer:\n%s****\n", answer);
110: # endif
111: assert (strlen(one)<ANSLEN);
112: assert (strlen(answer)<ANSLEN);
113: if (buff[0])
114: switch (newline(answer))
115: {
116: case 0:
117: fprintf (stderr, "No such paper %s\n", buff);
118: return;
119: default:
120: fprintf(stderr, "too many hits for '%s'\n", trimnl(buff));
121: choices(answer);
122: p = buff;
123: while (*p != '\n') p++;
124: *++p=0;
125: case 1:
126: # ifdef D1
127: fprintf(stderr, "found one\n");
128: # endif
129: if (endpush)
130: if (nr = chkdup(answer))
131: {
132: if (bare<2)
133: putsig (0, flds, nr, firline, line);
134: return;
135: }
136: # if D1
137: fprintf(stderr, "one[0] was %o\n",one[0]);
138: # endif
139: if (one[0]==0)
140: corout (answer, one, "deliv", dr, QLEN);
141: # if D1
142: fprintf(stderr, "one now %o\n",one[0]);
143: # endif
144: break;
145: }
146: assert (strlen(buff)<QLEN);
147: assert (strlen(one)<ANSLEN);
148: nf = tabs(flds, one);
149: nf += tabs(flds+nf, dbuff);
150: clean(flds, nf, 'L');
151: # if D1
152: fprintf(stderr, "one %.20s dbuff %.20s nf %d\n",one,dbuff, nf);
153: # endif
154: assert (nf < NFLD);
155: refnum++;
156: if (sort) putkey (nf, flds, refnum, keystr);
157: # if D1
158: fprintf(stderr, "past putkey, bare %d\n", bare);
159: # endif
160: if (bare<2)
161: putsig (nf, flds, refnum, firline, line);
162: else
163: flout();
164: # if D1
165: fprintf(stderr, "put signal\n");
166: # endif
167: putref (nf, flds);
168: # if D1
169: fprintf(stderr, "put ref\n");
170: # endif
171: }
172: newline(s)
173: char *s;
174: {
175: int k =0, c;
176: while (c = *s++)
177: if (c == '\n')
178: k++;
179: return(k);
180: }
181: choices( buff )
182: char *buff;
183: {
184: char ob[LLINE], *p, *r, *q, *t;
185: int nl;
186: for(r=p= buff; *p; p++)
187: {
188: if (*p == '\n')
189: {
190: *p++ = 0;
191: {
192: corout (r, ob, "deliv", dr, LLINE);
193: nl = 1;
194: for( q=ob; *q; q++)
195: {
196: if (nl && (q[0] == '.' || q[0] == '%') && q[1] == 'T')
197: {
198: q += 3;
199: for (t=q; *t && *t != '\n'; t++);
200: *t = 0;
201: fprintf(stderr, "%.70s\n", q);
202: q=0; break;
203: }
204: nl = *q == '\n';
205: }
206: if (q)
207: fprintf(stderr, "??? at %s\n",r);
208: }
209: r=p;
210: }
211: if (*p==0) break; /* the p++ might go past the end */
212: }
213: }
214:
215: control(c)
216: {
217: if (c=='.') return(1);
218: if (c=='%') return(1);
219: return(0);
220: }
221: dirfix(s)
222: char *s;
223: {
224: char *t;
225: for(t= s; *t; t++)
226: ;
227: while (t>s && *t!='/') t--;
228: if (t>s)
229: *t=0;
230: }
231: clean(xf, nf, c)
232: char *xf[];
233: {
234: int i, j;
235: for(i=nf-1; i>=0; i--)
236: {
237: if (control(xf[i][0]) && xf[i][1]==c)
238: break;
239: }
240: if (i<0) return;
241: for(j=i-1; j>=0; j--)
242: {
243: if (control(xf[j][0]) && xf[j][1]==c)
244: xf[j][1]= '~'; /* cancel */
245: }
246: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.