|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)refer2.c 4.2 (Berkeley) 6/5/84";
3: #endif
4:
5: #include "refer..c"
6: #define NFLD 30
7: #define TLEN 512
8:
9: extern FILE *in;
10: char one[ANSLEN];
11: int onelen = ANSLEN;
12: static char dr [100] = "";
13:
14: doref(line1)
15: char *line1;
16: {
17: char buff[QLEN], dbuff[3*QLEN];
18: char answer[ANSLEN], temp[TLEN], line[BUFSIZ];
19: char *p, **sr, *flds[NFLD], *r;
20: int stat, nf, nr, query = 0, alph, digs;
21:
22: again:
23: buff[0] = dbuff[0] = NULL;
24: if (biblio && Iline == 1 && line1[0] == '%')
25: strcat(dbuff, line1);
26: while (input(line)) { /* get query */
27: Iline++;
28: if (prefix(".]", line))
29: break;
30: if (biblio && line[0] == '\n')
31: break;
32: if (biblio && line[0] == '%' && line[1] == *convert)
33: break;
34: if (control(line[0]))
35: query = 1;
36: strcat(query ? dbuff : buff, line);
37: if (strlen(buff) > QLEN)
38: err("query too long (%d)", strlen(buff));
39: if (strlen(dbuff) > 3 * QLEN)
40: err("record at line %d too long", Iline-1);
41: }
42: if (biblio && line[0] == '\n' && feof(in))
43: return;
44: if (strcmp(buff, "$LIST$\n")==0) {
45: assert (dbuff[0] == 0);
46: dumpold();
47: return;
48: }
49: answer[0] = 0;
50: for (p = buff; *p; p++) {
51: if (isupper(*p))
52: *p |= 040;
53: }
54: alph = digs = 0;
55: for (p = buff; *p; p++) {
56: if (isalpha(*p))
57: alph++;
58: else
59: if (isdigit(*p))
60: digs++;
61: else {
62: *p = 0;
63: if ((alph+digs < 3) || common(p-alph)) {
64: r = p-alph;
65: while (r < p)
66: *r++ = ' ';
67: }
68: if (alph == 0 && digs > 0) {
69: r = p-digs;
70: if (digs != 4 || atoi(r)/100 != 19) {
71: while (r < p)
72: *r++ = ' ';
73: }
74: }
75: *p = ' ';
76: alph = digs = 0;
77: }
78: }
79: one[0] = 0;
80: if (buff[0]) { /* do not search if no query */
81: for (sr = rdata; sr < search; sr++) {
82: temp[0] = 0;
83: corout(buff, temp, "hunt", *sr, TLEN);
84: assert(strlen(temp) < TLEN);
85: if (strlen(temp)+strlen(answer) > BUFSIZ)
86: err("Accumulated answers too large",0);
87: strcat(answer, temp);
88: if (strlen(answer)>BUFSIZ)
89: err("answer too long (%d)", strlen(answer));
90: if (newline(answer) > 0)
91: break;
92: }
93: }
94: assert(strlen(one) < ANSLEN);
95: assert(strlen(answer) < ANSLEN);
96: if (buff[0])
97: switch (newline(answer)) {
98: case 0:
99: fprintf(stderr, "No such paper: %s\n", buff);
100: return;
101: default:
102: fprintf(stderr, "Too many hits: %s\n", trimnl(buff));
103: choices(answer);
104: p = buff;
105: while (*p != '\n')
106: p++;
107: *++p = 0;
108: case 1:
109: if (endpush)
110: if (nr = chkdup(answer)) {
111: if (bare < 2) {
112: nf = tabs(flds, one);
113: nf += tabs(flds+nf, dbuff);
114: assert(nf < NFLD);
115: putsig(nf,flds,nr,line1,line,0);
116: }
117: return;
118: }
119: if (one[0] == 0)
120: corout(answer, one, "deliv", dr, QLEN);
121: break;
122: }
123: assert(strlen(buff) < QLEN);
124: assert(strlen(one) < ANSLEN);
125: nf = tabs(flds, one);
126: nf += tabs(flds+nf, dbuff);
127: assert(nf < NFLD);
128: refnum++;
129: if (sort)
130: putkey(nf, flds, refnum, keystr);
131: if (bare < 2)
132: putsig(nf, flds, refnum, line1, line, 1);
133: else
134: flout();
135: putref(nf, flds);
136: if (biblio && line[0] == '\n')
137: goto again;
138: if (biblio && line[0] == '%' && line[1] == *convert)
139: fprintf(fo, "%s%c%s", convert+1, sep, line+3);
140: }
141:
142: newline(s)
143: char *s;
144: {
145: int k = 0, c;
146:
147: while (c = *s++)
148: if (c == '\n')
149: k++;
150: return(k);
151: }
152:
153: choices(buff)
154: char *buff;
155: {
156: char ob[BUFSIZ], *p, *r, *q, *t;
157: int nl;
158:
159: for (r = p = buff; *p; p++) {
160: if (*p == '\n') {
161: *p++ = 0;
162: corout(r, ob, "deliv", dr, BUFSIZ);
163: nl = 1;
164: for (q = ob; *q; q++) {
165: if (nl && (q[0]=='.'||q[0]=='%') && q[1]=='T') {
166: q += 3;
167: for (t = q; *t && *t != '\n'; t++)
168: ;
169: *t = 0;
170: fprintf(stderr, "%.70s\n", q);
171: q = 0;
172: break;
173: }
174: nl = *q == '\n';
175: }
176: if (q)
177: fprintf(stderr, "??? at %s\n",r);
178: r=p;
179: }
180: }
181: }
182:
183: control(c)
184: {
185: if (c == '.')
186: return(1);
187: if (c == '%')
188: return(1);
189: return(0);
190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.