home *** CD-ROM | disk | FTP | other *** search
- # 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[512], *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, 512, 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[512], *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);
- }
-