text: /*-
   * %sccs.include.proprietary.c%
   */
  
  #ifndef lint
  static char sccsid[] = "@(#)what2.c	4.3 (Berkeley) 04/18/91";
  #endif /* not lint */
  
  #include "stdio.h"
  #include "ctype.h"
  #define NS 5
  
  struct sf {
  	char *text;
  	int olap;
  } 
  sents[NS];
  struct sf *sp;
  char stext[NS][500];
  
  describe (file, argc, argv, rf)
  char *file, *argv[];
  FILE *rf;
  {
  	int ns = 0;
  	char linbuf[BUFSIZ], *line, *p;
  	int i, wrflg = 0, wrote = 0, ln = 0;
  	FILE *fi;
  	fi = fopen(file, "r");
  	if (fi==NULL) return;
  	for(i=1; i<argc; i++)
  		lcase(argv[i]);
  	while (gsent(linbuf, BUFSIZ, fi))
  	{
  		wrote=0;
  		for(line=linbuf; *line==' '; line++);
  		if (line[0]==0) continue;
  		for(p=line; *p; p++)
  			if (*p=='\t') *p= ' ';
  		if (wrflg && line[0]=='.' && isupper(line[1]))
  			wrflg=0;
  		if (wrflg)
  		{
  			output(line, ln, rf);
  			wrote=1;
  		}
  		if (prefix(".TL", line))
  			wrflg=1;
  		if (prefix(".AU", line))
  			wrflg = ln = 1;
  		if (prefix(".DA", line) || prefix(".ND", line))
  			output(line+4, 1, rf);
  		if (line[0]=='.')
  			continue;
  		if (wrote) continue;
  		ns=update(ns, line, count(line,argc,argv));
  	}
  	fclose(fi);
  	for(sp=sents; sp<sents+ns; sp++)
  		output(sp->text, 0, rf);
  }
  
  int state = 0;
  int oldc = '\n';
  
  gsent(buf, bsize, fi)
  char *buf;
  FILE *fi;
  {
  	char *s;
  	int c, leng = 0;
  	/* state
  		0: looking for '.' 
  		1: looking for nl or space aftter '.'
  		2: looking for nl after line with dot.
  		*/
  	s=buf;
  	if (state==2)
  		*s++='.';
  	while ( (c = getc(fi)) > 0 )
  	{
  		switch(state)
  		{
  		case 0: /* normal */
  			if (c=='.' && oldc == '\n')
  			{
  				*s=0;
  				state=2;
  				oldc='\n';
  				return(1);
  			}
  			*s++ = (c=='\n'? ' ': c);
  			if (s>=buf+bsize)
  			{
  				*--s = 0;
  				return(1);
  			}
  			if (c=='.' || c == '?' || c=='!')
  				if (leng>1)
  					state=1;
  			leng = (isalpha(c) ? leng+1 : 0);
  			break;
  		case 1: /* found ., want nl or space */
  			if (c==' ' || c == '\n')
  			{
  				*s=0;
  				state=0;
  				oldc=c;
  				return(1);
  			}
  			*s++ = (c=='\n' ? ' ' : c);
  			state=0;
  			leng = 0;
  			break;
  		case 2: /* found trof line, want nl */
  			if (c == '\n')
  			{
  				*s=0;
  				state=0;
  				oldc='\n';
  				return(1);
  			}
  			*s++ = c;
  			break;
  		}
  		oldc=c;
  	}
  	*s=0;
  	return(0);
  }
  
  prefix( p, s)
  char *p, *s;
  {
  	int c;
  	while ( (c= *p++) == *s++)
  		if (c==0)
  			return(1);
  	return(c==0);
  }
  
  output (s, ln, rf)
  char *s;
  FILE *rf;
  {
  	char *t;
  	int more = 1;
  	t=s;
  	while (more)
  	{
  		while (t<s+72 && *t)
  			t++;
  		if (*t)
  		{
  			while (*t != ' ' && t>(s+25))
  				t--;
  			*t=0;
  			more=1;
  		}
  		else
  			more=0;
  		printf("%s%s\n",ln++ ? "     " : "   ", s);
  		if (rf!=NULL)
  			fprintf(rf, "%s\n", s);
  		s= ++t;
  	}
  }
  
  count(isent, nw, wds)
  char *wds[], *isent;
  {
  	int saw[50], ct;
  	char sb[BUFSIZ], *s = sb;
  	int i, c;
  	for(i=1; i<nw; i++)
  		saw[i]=0;
  	while (c = *isent++)
  	{
  		*s++ = isupper(c) ? tolower(c) : c;
  	}
  	*s=0;
  	s=sb;
  	while (*s++)
  	{
  		if (s[-1]!=' ') continue;
  		for(i=1; i<nw; i++)
  		{
  			if (saw[i])continue;
  			if (prefix(wds[i], s))
  				saw[i]=1;
  		}
  	}
  	ct=0;
  	for(i=1; i<nw; i++)
  		if (saw[i])
  			ct++;
  	return(ct);
  }
  
  lcase(s)
  char *s;
  {
  	register int c;
  	for(; c= *s; s++)
  	{
  		if (isupper(c))
  			*s= tolower(c);
  	}
  }
  
  update( ns, line, kov)
  char *line;
  {
  	/* see if sentence array should be updated */
  	int lval = 100;
  	char *ob;
  	struct sf *sp, *least = NULL;
  	if (kov<=0) return (ns) ; /* no*/
  	if (ns<NS)
  	{
  		sp=sents+ns;
  		strcpy (sp->text = stext[ns], line);
  		sp->olap = kov;
  		return(ns+1);
  	}
  	for(sp=sents+ns-1; sp>=sents; sp--)
  	{
  		if (sp->olap < lval)
  		{
  			least = sp;
  			lval = sp->olap;
  		}
  	}
  	if (kov <= lval) return(ns);
  	ob = least->text;
  	while (++least < sents+NS)
  	{
  		(least-1)->text = least->text;
  		(least-1)->olap = least->olap;
  	}
  	sp = sents+NS-1;
  	strcpy (sp->text=ob, line);
  	sp->olap = kov;
  	return(NS);
  }
  