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