Research V7 development
[unix-history] / usr / src / cmd / refer / refer2.c
CommitLineData
52960f2f
ML
1# include "refer..c"
2extern FILE *in;
3# define NFLD 30
4# define TLEN 400
5char one[ANSLEN];
6int onelen ANSLEN;
7static char dr [100] "";
8doref(firline)
9 char *firline;
10{
11char buff[QLEN], dbuff[3*QLEN], answer[ANSLEN], temp[TLEN];
12char line[LLINE];
13char *p, **sr, *flds[NFLD], *r;
14int nf, nr, alph, query 0, chp, digs;
15
16/* get query */
17buff[0] = dbuff[0] = 0;
18while (input(line))
19 {
20 if (prefix(".]", line))
21 break;
22 if (control(line[0])) query=1;
23 strcat (query ? dbuff: buff, line);
24 if (strlen(buff)>QLEN)
25 err("buff too big (%d)", strlen(buff));
26 assert (strlen(dbuff) <3*QLEN);
27 }
28if (strcmp (buff, "$LIST$\n")==0)
29 {
30# if D1
31fprintf(stderr, "dump sorted list\n");
32# endif
33 assert ( dbuff[0]==0);
34 dumpold();
35 return;
36 }
37answer[0] = 0;
38# ifdef D1
39 fprintf(stderr, "query is %s\n",buff);
40# endif
41for( p=buff; *p; p++)
42 {
43 if (isupper(*p)) *p |= 040;
44 }
45alph = digs =0;
46for(p=buff; *p; p++)
47 {
48 if (isalpha(chp = *p)) alph++;
49 else
50 if (isdigit(*p)) digs++;
51 else
52 {
53 *p=0;
54 if ( (alph+digs<3) || common(p-alph))
55 {
56 r = p-alph;
57 while (r < p)
58 *r++ = ' ';
59 }
60 if ( alph==0 && digs >0)
61 {
62 r = p-digs;
63# if D1
64fprintf(stderr, "number, %d long, text is %s\n",digs,r);
65# endif
66 if (digs != 4 || (atoi(r)/100 != 19))
67 {
68 while (r<p)
69 *r++ = ' ';
70 }
71 }
72 *p=' ';
73 alph = digs = 0;
74 }
75 }
76# ifdef D1
77 fprintf(stderr, "query translated to %s\n", buff);
78# endif
79one[0]=0;
80if (buff[0]) /* do not search if no query */
81for( sr= data; sr < search; sr++)
82 {
83# ifdef D1
84 fprintf(stderr, "now searching %s\n", *sr);
85# endif
86 temp[0]=0;
87 corout (buff, temp, "hunt", *sr, TLEN);
88 assert (strlen(temp)<TLEN);
89 if (strlen(temp)+strlen(answer)>LLINE)
90 err("Accumulated answers too large",0);
91 strcat (answer, temp);
92 if (strlen(answer)>LLINE)
93 err("answer too long (%d)", strlen(answer));
94 if (newline(answer) > 0) break;
95 }
96# if D1
97fprintf(stderr, "answer:\n%s****\n", answer);
98# endif
99assert (strlen(one)<ANSLEN);
100assert (strlen(answer)<ANSLEN);
101if (buff[0])
102switch (newline(answer))
103 {
104 case 0:
105 fprintf (stderr, "No such paper %s\n", buff);
106 return;
107 default:
108 fprintf(stderr, "too many hits for '%s'\n", trimnl(buff));
109 choices(answer);
110 p = buff;
111 while (*p != '\n') p++;
112 *++p=0;
113 case 1:
114# ifdef D1
115 fprintf(stderr, "found one\n");
116# endif
117 if (endpush)
118 if (nr = chkdup(answer))
119 {
120 if (bare<2)
121 putsig (0, flds, nr, firline, line);
122 return;
123 }
124# if D1
125 fprintf(stderr, "one[0] was %o\n",one[0]);
126# endif
127 if (one[0]==0)
128 corout (answer, one, "deliv", dr, QLEN);
129# if D1
130 fprintf(stderr, "one now %o\n",one[0]);
131# endif
132 break;
133 }
134assert (strlen(buff)<QLEN);
135assert (strlen(one)<ANSLEN);
136nf = tabs(flds, one);
137nf += tabs(flds+nf, dbuff);
138# if D1
139fprintf(stderr, "one %.20s dbuff %.20s nf %d\n",one,dbuff, nf);
140# endif
141assert (nf < NFLD);
142refnum++;
143if (sort) putkey (nf, flds, refnum, keystr);
144if (bare<2)
145 putsig (nf, flds, refnum, firline, line);
146else
147 flout();
148# if D1
149fprintf(stderr, "put signal\n");
150# endif
151putref (nf, flds);
152# if D1
153fprintf(stderr, "put ref\n");
154# endif
155}
156newline(s)
157 char *s;
158{
159int k 0, c;
160while (c = *s++)
161 if (c == '\n')
162 k++;
163return(k);
164}
165choices( buff )
166 char *buff;
167{
168char ob[LLINE], *p, *r, *q, *t;
169int nl;
170for(r=p= buff; *p; p++)
171 {
172 if (*p == '\n')
173 {
174 *p++ = 0;
175 {
176 corout (r, ob, "deliv", dr, LLINE);
177 nl = 1;
178 for( q=ob; *q; q++)
179 {
180 if (nl && (q[0] == '.' || q[0] == '%') && q[1] == 'T')
181 {
182 q += 3;
183 for (t=q; *t && *t != '\n'; t++);
184 *t = 0;
185 fprintf(stderr, "%.70s\n", q);
186 q=0; break;
187 }
188 nl = *q == '\n';
189 }
190 if (q)
191 fprintf(stderr, "??? at %s\n",r);
192 }
193 r=p;
194 }
195 }
196}
197
198control(c)
199 {
200 if (c=='.') return(1);
201 if (c=='%') return(1);
202 return(0);
203 }