1*48292Sbostic /*-
2*48292Sbostic * %sccs.include.proprietary.c%
3*48292Sbostic */
4*48292Sbostic
512308Stut #ifndef lint
6*48292Sbostic static char sccsid[] = "@(#)what2.c 4.3 (Berkeley) 04/18/91";
7*48292Sbostic #endif /* not lint */
812308Stut
912308Stut #include "stdio.h"
1012308Stut #include "ctype.h"
1112308Stut #define NS 5
1212308Stut
1312308Stut struct sf {
1412308Stut char *text;
1512308Stut int olap;
1612308Stut }
1712308Stut sents[NS];
1812308Stut struct sf *sp;
1912308Stut char stext[NS][500];
2012308Stut
describe(file,argc,argv,rf)2112308Stut describe (file, argc, argv, rf)
2212308Stut char *file, *argv[];
2312308Stut FILE *rf;
2412308Stut {
2532129Sbostic int ns = 0;
2612308Stut char linbuf[BUFSIZ], *line, *p;
2732129Sbostic int i, wrflg = 0, wrote = 0, ln = 0;
2812308Stut FILE *fi;
2912308Stut fi = fopen(file, "r");
3012308Stut if (fi==NULL) return;
3112308Stut for(i=1; i<argc; i++)
3212308Stut lcase(argv[i]);
3312308Stut while (gsent(linbuf, BUFSIZ, fi))
3412308Stut {
3512308Stut wrote=0;
3612308Stut for(line=linbuf; *line==' '; line++);
3712308Stut if (line[0]==0) continue;
3812308Stut for(p=line; *p; p++)
3912308Stut if (*p=='\t') *p= ' ';
4012308Stut if (wrflg && line[0]=='.' && isupper(line[1]))
4112308Stut wrflg=0;
4212308Stut if (wrflg)
4312308Stut {
4412308Stut output(line, ln, rf);
4512308Stut wrote=1;
4612308Stut }
4712308Stut if (prefix(".TL", line))
4812308Stut wrflg=1;
4912308Stut if (prefix(".AU", line))
5012308Stut wrflg = ln = 1;
5112308Stut if (prefix(".DA", line) || prefix(".ND", line))
5212308Stut output(line+4, 1, rf);
5312308Stut if (line[0]=='.')
5412308Stut continue;
5512308Stut if (wrote) continue;
5612308Stut ns=update(ns, line, count(line,argc,argv));
5712308Stut }
5812308Stut fclose(fi);
5912308Stut for(sp=sents; sp<sents+ns; sp++)
6012308Stut output(sp->text, 0, rf);
6112308Stut }
6212308Stut
6332129Sbostic int state = 0;
6432129Sbostic int oldc = '\n';
6512308Stut
gsent(buf,bsize,fi)6612308Stut gsent(buf, bsize, fi)
6712308Stut char *buf;
6812308Stut FILE *fi;
6912308Stut {
7012308Stut char *s;
7132129Sbostic int c, leng = 0;
7212308Stut /* state
7312308Stut 0: looking for '.'
7412308Stut 1: looking for nl or space aftter '.'
7512308Stut 2: looking for nl after line with dot.
7612308Stut */
7712308Stut s=buf;
7812308Stut if (state==2)
7912308Stut *s++='.';
8012308Stut while ( (c = getc(fi)) > 0 )
8112308Stut {
8212308Stut switch(state)
8312308Stut {
8412308Stut case 0: /* normal */
8512308Stut if (c=='.' && oldc == '\n')
8612308Stut {
8712308Stut *s=0;
8812308Stut state=2;
8912308Stut oldc='\n';
9012308Stut return(1);
9112308Stut }
9212308Stut *s++ = (c=='\n'? ' ': c);
9312308Stut if (s>=buf+bsize)
9412308Stut {
9512308Stut *--s = 0;
9612308Stut return(1);
9712308Stut }
9812308Stut if (c=='.' || c == '?' || c=='!')
9912308Stut if (leng>1)
10012308Stut state=1;
10112308Stut leng = (isalpha(c) ? leng+1 : 0);
10212308Stut break;
10312308Stut case 1: /* found ., want nl or space */
10412308Stut if (c==' ' || c == '\n')
10512308Stut {
10612308Stut *s=0;
10712308Stut state=0;
10812308Stut oldc=c;
10912308Stut return(1);
11012308Stut }
11112308Stut *s++ = (c=='\n' ? ' ' : c);
11212308Stut state=0;
11312308Stut leng = 0;
11412308Stut break;
11512308Stut case 2: /* found trof line, want nl */
11612308Stut if (c == '\n')
11712308Stut {
11812308Stut *s=0;
11912308Stut state=0;
12012308Stut oldc='\n';
12112308Stut return(1);
12212308Stut }
12312308Stut *s++ = c;
12412308Stut break;
12512308Stut }
12612308Stut oldc=c;
12712308Stut }
12812308Stut *s=0;
12912308Stut return(0);
13012308Stut }
13112308Stut
prefix(p,s)13212308Stut prefix( p, s)
13312308Stut char *p, *s;
13412308Stut {
13512308Stut int c;
13612308Stut while ( (c= *p++) == *s++)
13712308Stut if (c==0)
13812308Stut return(1);
13912308Stut return(c==0);
14012308Stut }
14112308Stut
output(s,ln,rf)14212308Stut output (s, ln, rf)
14312308Stut char *s;
14412308Stut FILE *rf;
14512308Stut {
14612308Stut char *t;
14732129Sbostic int more = 1;
14812308Stut t=s;
14912308Stut while (more)
15012308Stut {
15112308Stut while (t<s+72 && *t)
15212308Stut t++;
15312308Stut if (*t)
15412308Stut {
15512308Stut while (*t != ' ' && t>(s+25))
15612308Stut t--;
15712308Stut *t=0;
15812308Stut more=1;
15912308Stut }
16012308Stut else
16112308Stut more=0;
16212308Stut printf("%s%s\n",ln++ ? " " : " ", s);
16312308Stut if (rf!=NULL)
16412308Stut fprintf(rf, "%s\n", s);
16512308Stut s= ++t;
16612308Stut }
16712308Stut }
16812308Stut
count(isent,nw,wds)16912308Stut count(isent, nw, wds)
17012308Stut char *wds[], *isent;
17112308Stut {
17212308Stut int saw[50], ct;
17332129Sbostic char sb[BUFSIZ], *s = sb;
17412308Stut int i, c;
17512308Stut for(i=1; i<nw; i++)
17612308Stut saw[i]=0;
17712308Stut while (c = *isent++)
17812308Stut {
17912308Stut *s++ = isupper(c) ? tolower(c) : c;
18012308Stut }
18112308Stut *s=0;
18212308Stut s=sb;
18312308Stut while (*s++)
18412308Stut {
18512308Stut if (s[-1]!=' ') continue;
18612308Stut for(i=1; i<nw; i++)
18712308Stut {
18812308Stut if (saw[i])continue;
18912308Stut if (prefix(wds[i], s))
19012308Stut saw[i]=1;
19112308Stut }
19212308Stut }
19312308Stut ct=0;
19412308Stut for(i=1; i<nw; i++)
19512308Stut if (saw[i])
19612308Stut ct++;
19712308Stut return(ct);
19812308Stut }
19912308Stut
lcase(s)20012308Stut lcase(s)
20112308Stut char *s;
20212308Stut {
20312308Stut register int c;
20412308Stut for(; c= *s; s++)
20512308Stut {
20612308Stut if (isupper(c))
20712308Stut *s= tolower(c);
20812308Stut }
20912308Stut }
21012308Stut
update(ns,line,kov)21112308Stut update( ns, line, kov)
21212308Stut char *line;
21312308Stut {
21412308Stut /* see if sentence array should be updated */
21532129Sbostic int lval = 100;
21612308Stut char *ob;
21732129Sbostic struct sf *sp, *least = NULL;
21812308Stut if (kov<=0) return (ns) ; /* no*/
21912308Stut if (ns<NS)
22012308Stut {
22112308Stut sp=sents+ns;
22212308Stut strcpy (sp->text = stext[ns], line);
22312308Stut sp->olap = kov;
22412308Stut return(ns+1);
22512308Stut }
22612308Stut for(sp=sents+ns-1; sp>=sents; sp--)
22712308Stut {
22812308Stut if (sp->olap < lval)
22912308Stut {
23012308Stut least = sp;
23112308Stut lval = sp->olap;
23212308Stut }
23312308Stut }
23412308Stut if (kov <= lval) return(ns);
23512308Stut ob = least->text;
23612308Stut while (++least < sents+NS)
23712308Stut {
23812308Stut (least-1)->text = least->text;
23912308Stut (least-1)->olap = least->olap;
24012308Stut }
24112308Stut sp = sents+NS-1;
24212308Stut strcpy (sp->text=ob, line);
24312308Stut sp->olap = kov;
24412308Stut return(NS);
24512308Stut }
246