date and time created 83/05/06 23:50:15 by tut
authorBill Tuthill <tut@ucbvax.Berkeley.EDU>
Sat, 7 May 1983 14:50:15 +0000 (06:50 -0800)
committerBill Tuthill <tut@ucbvax.Berkeley.EDU>
Sat, 7 May 1983 14:50:15 +0000 (06:50 -0800)
SCCS-vsn: old/refer/NOTUSED/whatabout/what2.c 4.1

usr/src/old/refer/NOTUSED/whatabout/what2.c [new file with mode: 0644]

diff --git a/usr/src/old/refer/NOTUSED/whatabout/what2.c b/usr/src/old/refer/NOTUSED/whatabout/what2.c
new file mode 100644 (file)
index 0000000..dacdd55
--- /dev/null
@@ -0,0 +1,241 @@
+#ifndef lint
+static char *sccsid = "@(#)what2.c     4.1 (Berkeley) %G%";
+#endif
+
+#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);
+}