1*80dc960aSbostic /*-
2*80dc960aSbostic  * %sccs.include.proprietary.c%
3*80dc960aSbostic  */
4*80dc960aSbostic 
52144c2d8Stut #ifndef lint
6*80dc960aSbostic static char sccsid[] = "@(#)what2.c	4.3 (Berkeley) 04/18/91";
7*80dc960aSbostic #endif /* not lint */
82144c2d8Stut 
92144c2d8Stut #include "stdio.h"
102144c2d8Stut #include "ctype.h"
112144c2d8Stut #define NS 5
122144c2d8Stut 
132144c2d8Stut struct sf {
142144c2d8Stut 	char *text;
152144c2d8Stut 	int olap;
162144c2d8Stut }
172144c2d8Stut sents[NS];
182144c2d8Stut struct sf *sp;
192144c2d8Stut char stext[NS][500];
202144c2d8Stut 
describe(file,argc,argv,rf)212144c2d8Stut describe (file, argc, argv, rf)
222144c2d8Stut char *file, *argv[];
232144c2d8Stut FILE *rf;
242144c2d8Stut {
25966336d2Sbostic 	int ns = 0;
262144c2d8Stut 	char linbuf[BUFSIZ], *line, *p;
27966336d2Sbostic 	int i, wrflg = 0, wrote = 0, ln = 0;
282144c2d8Stut 	FILE *fi;
292144c2d8Stut 	fi = fopen(file, "r");
302144c2d8Stut 	if (fi==NULL) return;
312144c2d8Stut 	for(i=1; i<argc; i++)
322144c2d8Stut 		lcase(argv[i]);
332144c2d8Stut 	while (gsent(linbuf, BUFSIZ, fi))
342144c2d8Stut 	{
352144c2d8Stut 		wrote=0;
362144c2d8Stut 		for(line=linbuf; *line==' '; line++);
372144c2d8Stut 		if (line[0]==0) continue;
382144c2d8Stut 		for(p=line; *p; p++)
392144c2d8Stut 			if (*p=='\t') *p= ' ';
402144c2d8Stut 		if (wrflg && line[0]=='.' && isupper(line[1]))
412144c2d8Stut 			wrflg=0;
422144c2d8Stut 		if (wrflg)
432144c2d8Stut 		{
442144c2d8Stut 			output(line, ln, rf);
452144c2d8Stut 			wrote=1;
462144c2d8Stut 		}
472144c2d8Stut 		if (prefix(".TL", line))
482144c2d8Stut 			wrflg=1;
492144c2d8Stut 		if (prefix(".AU", line))
502144c2d8Stut 			wrflg = ln = 1;
512144c2d8Stut 		if (prefix(".DA", line) || prefix(".ND", line))
522144c2d8Stut 			output(line+4, 1, rf);
532144c2d8Stut 		if (line[0]=='.')
542144c2d8Stut 			continue;
552144c2d8Stut 		if (wrote) continue;
562144c2d8Stut 		ns=update(ns, line, count(line,argc,argv));
572144c2d8Stut 	}
582144c2d8Stut 	fclose(fi);
592144c2d8Stut 	for(sp=sents; sp<sents+ns; sp++)
602144c2d8Stut 		output(sp->text, 0, rf);
612144c2d8Stut }
622144c2d8Stut 
63966336d2Sbostic int state = 0;
64966336d2Sbostic int oldc = '\n';
652144c2d8Stut 
gsent(buf,bsize,fi)662144c2d8Stut gsent(buf, bsize, fi)
672144c2d8Stut char *buf;
682144c2d8Stut FILE *fi;
692144c2d8Stut {
702144c2d8Stut 	char *s;
71966336d2Sbostic 	int c, leng = 0;
722144c2d8Stut 	/* state
732144c2d8Stut 		0: looking for '.'
742144c2d8Stut 		1: looking for nl or space aftter '.'
752144c2d8Stut 		2: looking for nl after line with dot.
762144c2d8Stut 		*/
772144c2d8Stut 	s=buf;
782144c2d8Stut 	if (state==2)
792144c2d8Stut 		*s++='.';
802144c2d8Stut 	while ( (c = getc(fi)) > 0 )
812144c2d8Stut 	{
822144c2d8Stut 		switch(state)
832144c2d8Stut 		{
842144c2d8Stut 		case 0: /* normal */
852144c2d8Stut 			if (c=='.' && oldc == '\n')
862144c2d8Stut 			{
872144c2d8Stut 				*s=0;
882144c2d8Stut 				state=2;
892144c2d8Stut 				oldc='\n';
902144c2d8Stut 				return(1);
912144c2d8Stut 			}
922144c2d8Stut 			*s++ = (c=='\n'? ' ': c);
932144c2d8Stut 			if (s>=buf+bsize)
942144c2d8Stut 			{
952144c2d8Stut 				*--s = 0;
962144c2d8Stut 				return(1);
972144c2d8Stut 			}
982144c2d8Stut 			if (c=='.' || c == '?' || c=='!')
992144c2d8Stut 				if (leng>1)
1002144c2d8Stut 					state=1;
1012144c2d8Stut 			leng = (isalpha(c) ? leng+1 : 0);
1022144c2d8Stut 			break;
1032144c2d8Stut 		case 1: /* found ., want nl or space */
1042144c2d8Stut 			if (c==' ' || c == '\n')
1052144c2d8Stut 			{
1062144c2d8Stut 				*s=0;
1072144c2d8Stut 				state=0;
1082144c2d8Stut 				oldc=c;
1092144c2d8Stut 				return(1);
1102144c2d8Stut 			}
1112144c2d8Stut 			*s++ = (c=='\n' ? ' ' : c);
1122144c2d8Stut 			state=0;
1132144c2d8Stut 			leng = 0;
1142144c2d8Stut 			break;
1152144c2d8Stut 		case 2: /* found trof line, want nl */
1162144c2d8Stut 			if (c == '\n')
1172144c2d8Stut 			{
1182144c2d8Stut 				*s=0;
1192144c2d8Stut 				state=0;
1202144c2d8Stut 				oldc='\n';
1212144c2d8Stut 				return(1);
1222144c2d8Stut 			}
1232144c2d8Stut 			*s++ = c;
1242144c2d8Stut 			break;
1252144c2d8Stut 		}
1262144c2d8Stut 		oldc=c;
1272144c2d8Stut 	}
1282144c2d8Stut 	*s=0;
1292144c2d8Stut 	return(0);
1302144c2d8Stut }
1312144c2d8Stut 
prefix(p,s)1322144c2d8Stut prefix( p, s)
1332144c2d8Stut char *p, *s;
1342144c2d8Stut {
1352144c2d8Stut 	int c;
1362144c2d8Stut 	while ( (c= *p++) == *s++)
1372144c2d8Stut 		if (c==0)
1382144c2d8Stut 			return(1);
1392144c2d8Stut 	return(c==0);
1402144c2d8Stut }
1412144c2d8Stut 
output(s,ln,rf)1422144c2d8Stut output (s, ln, rf)
1432144c2d8Stut char *s;
1442144c2d8Stut FILE *rf;
1452144c2d8Stut {
1462144c2d8Stut 	char *t;
147966336d2Sbostic 	int more = 1;
1482144c2d8Stut 	t=s;
1492144c2d8Stut 	while (more)
1502144c2d8Stut 	{
1512144c2d8Stut 		while (t<s+72 && *t)
1522144c2d8Stut 			t++;
1532144c2d8Stut 		if (*t)
1542144c2d8Stut 		{
1552144c2d8Stut 			while (*t != ' ' && t>(s+25))
1562144c2d8Stut 				t--;
1572144c2d8Stut 			*t=0;
1582144c2d8Stut 			more=1;
1592144c2d8Stut 		}
1602144c2d8Stut 		else
1612144c2d8Stut 			more=0;
1622144c2d8Stut 		printf("%s%s\n",ln++ ? "     " : "   ", s);
1632144c2d8Stut 		if (rf!=NULL)
1642144c2d8Stut 			fprintf(rf, "%s\n", s);
1652144c2d8Stut 		s= ++t;
1662144c2d8Stut 	}
1672144c2d8Stut }
1682144c2d8Stut 
count(isent,nw,wds)1692144c2d8Stut count(isent, nw, wds)
1702144c2d8Stut char *wds[], *isent;
1712144c2d8Stut {
1722144c2d8Stut 	int saw[50], ct;
173966336d2Sbostic 	char sb[BUFSIZ], *s = sb;
1742144c2d8Stut 	int i, c;
1752144c2d8Stut 	for(i=1; i<nw; i++)
1762144c2d8Stut 		saw[i]=0;
1772144c2d8Stut 	while (c = *isent++)
1782144c2d8Stut 	{
1792144c2d8Stut 		*s++ = isupper(c) ? tolower(c) : c;
1802144c2d8Stut 	}
1812144c2d8Stut 	*s=0;
1822144c2d8Stut 	s=sb;
1832144c2d8Stut 	while (*s++)
1842144c2d8Stut 	{
1852144c2d8Stut 		if (s[-1]!=' ') continue;
1862144c2d8Stut 		for(i=1; i<nw; i++)
1872144c2d8Stut 		{
1882144c2d8Stut 			if (saw[i])continue;
1892144c2d8Stut 			if (prefix(wds[i], s))
1902144c2d8Stut 				saw[i]=1;
1912144c2d8Stut 		}
1922144c2d8Stut 	}
1932144c2d8Stut 	ct=0;
1942144c2d8Stut 	for(i=1; i<nw; i++)
1952144c2d8Stut 		if (saw[i])
1962144c2d8Stut 			ct++;
1972144c2d8Stut 	return(ct);
1982144c2d8Stut }
1992144c2d8Stut 
lcase(s)2002144c2d8Stut lcase(s)
2012144c2d8Stut char *s;
2022144c2d8Stut {
2032144c2d8Stut 	register int c;
2042144c2d8Stut 	for(; c= *s; s++)
2052144c2d8Stut 	{
2062144c2d8Stut 		if (isupper(c))
2072144c2d8Stut 			*s= tolower(c);
2082144c2d8Stut 	}
2092144c2d8Stut }
2102144c2d8Stut 
update(ns,line,kov)2112144c2d8Stut update( ns, line, kov)
2122144c2d8Stut char *line;
2132144c2d8Stut {
2142144c2d8Stut 	/* see if sentence array should be updated */
215966336d2Sbostic 	int lval = 100;
2162144c2d8Stut 	char *ob;
217966336d2Sbostic 	struct sf *sp, *least = NULL;
2182144c2d8Stut 	if (kov<=0) return (ns) ; /* no*/
2192144c2d8Stut 	if (ns<NS)
2202144c2d8Stut 	{
2212144c2d8Stut 		sp=sents+ns;
2222144c2d8Stut 		strcpy (sp->text = stext[ns], line);
2232144c2d8Stut 		sp->olap = kov;
2242144c2d8Stut 		return(ns+1);
2252144c2d8Stut 	}
2262144c2d8Stut 	for(sp=sents+ns-1; sp>=sents; sp--)
2272144c2d8Stut 	{
2282144c2d8Stut 		if (sp->olap < lval)
2292144c2d8Stut 		{
2302144c2d8Stut 			least = sp;
2312144c2d8Stut 			lval = sp->olap;
2322144c2d8Stut 		}
2332144c2d8Stut 	}
2342144c2d8Stut 	if (kov <= lval) return(ns);
2352144c2d8Stut 	ob = least->text;
2362144c2d8Stut 	while (++least < sents+NS)
2372144c2d8Stut 	{
2382144c2d8Stut 		(least-1)->text = least->text;
2392144c2d8Stut 		(least-1)->olap = least->olap;
2402144c2d8Stut 	}
2412144c2d8Stut 	sp = sents+NS-1;
2422144c2d8Stut 	strcpy (sp->text=ob, line);
2432144c2d8Stut 	sp->olap = kov;
2442144c2d8Stut 	return(NS);
2452144c2d8Stut }
246