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