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