1 #ifndef lint
2 static char *sccsid = "@(#)what2.c	4.1 (Berkeley) 05/06/83";
3 #endif
4 
5 #include "stdio.h"
6 #include "ctype.h"
7 #define NS 5
8 
9 struct sf {
10 	char *text;
11 	int olap;
12 }
13 sents[NS];
14 struct sf *sp;
15 char stext[NS][500];
16 
17 describe (file, argc, argv, rf)
18 char *file, *argv[];
19 FILE *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 
59 int state 0;
60 int oldc '\n';
61 
62 gsent(buf, bsize, fi)
63 char *buf;
64 FILE *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 
128 prefix( p, s)
129 char *p, *s;
130 {
131 	int c;
132 	while ( (c= *p++) == *s++)
133 		if (c==0)
134 			return(1);
135 	return(c==0);
136 }
137 
138 output (s, ln, rf)
139 char *s;
140 FILE *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 
165 count(isent, nw, wds)
166 char *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 
196 lcase(s)
197 char *s;
198 {
199 	register int c;
200 	for(; c= *s; s++)
201 	{
202 		if (isupper(c))
203 			*s= tolower(c);
204 	}
205 }
206 
207 update( ns, line, kov)
208 char *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 }
242