date and time created 83/05/06 23:50:15 by tut
[unix-history] / usr / src / old / refer / NOTUSED / whatabout / what2.c
CommitLineData
a551a3dd
BT
1#ifndef lint
2static char *sccsid = "@(#)what2.c 4.1 (Berkeley) %G%";
3#endif
4
5#include "stdio.h"
6#include "ctype.h"
7#define NS 5
8
9struct sf {
10 char *text;
11 int olap;
12}
13sents[NS];
14struct sf *sp;
15char stext[NS][500];
16
17describe (file, argc, argv, rf)
18char *file, *argv[];
19FILE *rf;
20{
21 int ns 0;
22 char linbuf[BUFSIZ], *line, *p;
23 int i, wrflg 0, wrote 0, ln 0;
24 FILE *fi;
25 fi = fopen(file, "r");
26 if (fi==NULL) return;
27 for(i=1; i<argc; i++)
28 lcase(argv[i]);
29 while (gsent(linbuf, BUFSIZ, fi))
30 {
31 wrote=0;
32 for(line=linbuf; *line==' '; line++);
33 if (line[0]==0) continue;
34 for(p=line; *p; p++)
35 if (*p=='\t') *p= ' ';
36 if (wrflg && line[0]=='.' && isupper(line[1]))
37 wrflg=0;
38 if (wrflg)
39 {
40 output(line, ln, rf);
41 wrote=1;
42 }
43 if (prefix(".TL", line))
44 wrflg=1;
45 if (prefix(".AU", line))
46 wrflg = ln = 1;
47 if (prefix(".DA", line) || prefix(".ND", line))
48 output(line+4, 1, rf);
49 if (line[0]=='.')
50 continue;
51 if (wrote) continue;
52 ns=update(ns, line, count(line,argc,argv));
53 }
54 fclose(fi);
55 for(sp=sents; sp<sents+ns; sp++)
56 output(sp->text, 0, rf);
57}
58
59int state 0;
60int oldc '\n';
61
62gsent(buf, bsize, fi)
63char *buf;
64FILE *fi;
65{
66 char *s;
67 int c, leng 0;
68 /* state
69 0: looking for '.'
70 1: looking for nl or space aftter '.'
71 2: looking for nl after line with dot.
72 */
73 s=buf;
74 if (state==2)
75 *s++='.';
76 while ( (c = getc(fi)) > 0 )
77 {
78 switch(state)
79 {
80 case 0: /* normal */
81 if (c=='.' && oldc == '\n')
82 {
83 *s=0;
84 state=2;
85 oldc='\n';
86 return(1);
87 }
88 *s++ = (c=='\n'? ' ': c);
89 if (s>=buf+bsize)
90 {
91 *--s = 0;
92 return(1);
93 }
94 if (c=='.' || c == '?' || c=='!')
95 if (leng>1)
96 state=1;
97 leng = (isalpha(c) ? leng+1 : 0);
98 break;
99 case 1: /* found ., want nl or space */
100 if (c==' ' || c == '\n')
101 {
102 *s=0;
103 state=0;
104 oldc=c;
105 return(1);
106 }
107 *s++ = (c=='\n' ? ' ' : c);
108 state=0;
109 leng = 0;
110 break;
111 case 2: /* found trof line, want nl */
112 if (c == '\n')
113 {
114 *s=0;
115 state=0;
116 oldc='\n';
117 return(1);
118 }
119 *s++ = c;
120 break;
121 }
122 oldc=c;
123 }
124 *s=0;
125 return(0);
126}
127
128prefix( p, s)
129char *p, *s;
130{
131 int c;
132 while ( (c= *p++) == *s++)
133 if (c==0)
134 return(1);
135 return(c==0);
136}
137
138output (s, ln, rf)
139char *s;
140FILE *rf;
141{
142 char *t;
143 int more 1;
144 t=s;
145 while (more)
146 {
147 while (t<s+72 && *t)
148 t++;
149 if (*t)
150 {
151 while (*t != ' ' && t>(s+25))
152 t--;
153 *t=0;
154 more=1;
155 }
156 else
157 more=0;
158 printf("%s%s\n",ln++ ? " " : " ", s);
159 if (rf!=NULL)
160 fprintf(rf, "%s\n", s);
161 s= ++t;
162 }
163}
164
165count(isent, nw, wds)
166char *wds[], *isent;
167{
168 int saw[50], ct;
169 char sb[BUFSIZ], *s sb;
170 int i, c;
171 for(i=1; i<nw; i++)
172 saw[i]=0;
173 while (c = *isent++)
174 {
175 *s++ = isupper(c) ? tolower(c) : c;
176 }
177 *s=0;
178 s=sb;
179 while (*s++)
180 {
181 if (s[-1]!=' ') continue;
182 for(i=1; i<nw; i++)
183 {
184 if (saw[i])continue;
185 if (prefix(wds[i], s))
186 saw[i]=1;
187 }
188 }
189 ct=0;
190 for(i=1; i<nw; i++)
191 if (saw[i])
192 ct++;
193 return(ct);
194}
195
196lcase(s)
197char *s;
198{
199 register int c;
200 for(; c= *s; s++)
201 {
202 if (isupper(c))
203 *s= tolower(c);
204 }
205}
206
207update( ns, line, kov)
208char *line;
209{
210 /* see if sentence array should be updated */
211 int lval 100;
212 char *ob;
213 struct sf *sp, *least NULL;
214 if (kov<=0) return (ns) ; /* no*/
215 if (ns<NS)
216 {
217 sp=sents+ns;
218 strcpy (sp->text = stext[ns], line);
219 sp->olap = kov;
220 return(ns+1);
221 }
222 for(sp=sents+ns-1; sp>=sents; sp--)
223 {
224 if (sp->olap < lval)
225 {
226 least = sp;
227 lval = sp->olap;
228 }
229 }
230 if (kov <= lval) return(ns);
231 ob = least->text;
232 while (++least < sents+NS)
233 {
234 (least-1)->text = least->text;
235 (least-1)->olap = least->olap;
236 }
237 sp = sents+NS-1;
238 strcpy (sp->text=ob, line);
239 sp->olap = kov;
240 return(NS);
241}