1*12308Stut #ifndef lint 2*12308Stut static char *sccsid = "@(#)what2.c 4.1 (Berkeley) 05/06/83"; 3*12308Stut #endif 4*12308Stut 5*12308Stut #include "stdio.h" 6*12308Stut #include "ctype.h" 7*12308Stut #define NS 5 8*12308Stut 9*12308Stut struct sf { 10*12308Stut char *text; 11*12308Stut int olap; 12*12308Stut } 13*12308Stut sents[NS]; 14*12308Stut struct sf *sp; 15*12308Stut char stext[NS][500]; 16*12308Stut 17*12308Stut describe (file, argc, argv, rf) 18*12308Stut char *file, *argv[]; 19*12308Stut FILE *rf; 20*12308Stut { 21*12308Stut int ns 0; 22*12308Stut char linbuf[BUFSIZ], *line, *p; 23*12308Stut int i, wrflg 0, wrote 0, ln 0; 24*12308Stut FILE *fi; 25*12308Stut fi = fopen(file, "r"); 26*12308Stut if (fi==NULL) return; 27*12308Stut for(i=1; i<argc; i++) 28*12308Stut lcase(argv[i]); 29*12308Stut while (gsent(linbuf, BUFSIZ, fi)) 30*12308Stut { 31*12308Stut wrote=0; 32*12308Stut for(line=linbuf; *line==' '; line++); 33*12308Stut if (line[0]==0) continue; 34*12308Stut for(p=line; *p; p++) 35*12308Stut if (*p=='\t') *p= ' '; 36*12308Stut if (wrflg && line[0]=='.' && isupper(line[1])) 37*12308Stut wrflg=0; 38*12308Stut if (wrflg) 39*12308Stut { 40*12308Stut output(line, ln, rf); 41*12308Stut wrote=1; 42*12308Stut } 43*12308Stut if (prefix(".TL", line)) 44*12308Stut wrflg=1; 45*12308Stut if (prefix(".AU", line)) 46*12308Stut wrflg = ln = 1; 47*12308Stut if (prefix(".DA", line) || prefix(".ND", line)) 48*12308Stut output(line+4, 1, rf); 49*12308Stut if (line[0]=='.') 50*12308Stut continue; 51*12308Stut if (wrote) continue; 52*12308Stut ns=update(ns, line, count(line,argc,argv)); 53*12308Stut } 54*12308Stut fclose(fi); 55*12308Stut for(sp=sents; sp<sents+ns; sp++) 56*12308Stut output(sp->text, 0, rf); 57*12308Stut } 58*12308Stut 59*12308Stut int state 0; 60*12308Stut int oldc '\n'; 61*12308Stut 62*12308Stut gsent(buf, bsize, fi) 63*12308Stut char *buf; 64*12308Stut FILE *fi; 65*12308Stut { 66*12308Stut char *s; 67*12308Stut int c, leng 0; 68*12308Stut /* state 69*12308Stut 0: looking for '.' 70*12308Stut 1: looking for nl or space aftter '.' 71*12308Stut 2: looking for nl after line with dot. 72*12308Stut */ 73*12308Stut s=buf; 74*12308Stut if (state==2) 75*12308Stut *s++='.'; 76*12308Stut while ( (c = getc(fi)) > 0 ) 77*12308Stut { 78*12308Stut switch(state) 79*12308Stut { 80*12308Stut case 0: /* normal */ 81*12308Stut if (c=='.' && oldc == '\n') 82*12308Stut { 83*12308Stut *s=0; 84*12308Stut state=2; 85*12308Stut oldc='\n'; 86*12308Stut return(1); 87*12308Stut } 88*12308Stut *s++ = (c=='\n'? ' ': c); 89*12308Stut if (s>=buf+bsize) 90*12308Stut { 91*12308Stut *--s = 0; 92*12308Stut return(1); 93*12308Stut } 94*12308Stut if (c=='.' || c == '?' || c=='!') 95*12308Stut if (leng>1) 96*12308Stut state=1; 97*12308Stut leng = (isalpha(c) ? leng+1 : 0); 98*12308Stut break; 99*12308Stut case 1: /* found ., want nl or space */ 100*12308Stut if (c==' ' || c == '\n') 101*12308Stut { 102*12308Stut *s=0; 103*12308Stut state=0; 104*12308Stut oldc=c; 105*12308Stut return(1); 106*12308Stut } 107*12308Stut *s++ = (c=='\n' ? ' ' : c); 108*12308Stut state=0; 109*12308Stut leng = 0; 110*12308Stut break; 111*12308Stut case 2: /* found trof line, want nl */ 112*12308Stut if (c == '\n') 113*12308Stut { 114*12308Stut *s=0; 115*12308Stut state=0; 116*12308Stut oldc='\n'; 117*12308Stut return(1); 118*12308Stut } 119*12308Stut *s++ = c; 120*12308Stut break; 121*12308Stut } 122*12308Stut oldc=c; 123*12308Stut } 124*12308Stut *s=0; 125*12308Stut return(0); 126*12308Stut } 127*12308Stut 128*12308Stut prefix( p, s) 129*12308Stut char *p, *s; 130*12308Stut { 131*12308Stut int c; 132*12308Stut while ( (c= *p++) == *s++) 133*12308Stut if (c==0) 134*12308Stut return(1); 135*12308Stut return(c==0); 136*12308Stut } 137*12308Stut 138*12308Stut output (s, ln, rf) 139*12308Stut char *s; 140*12308Stut FILE *rf; 141*12308Stut { 142*12308Stut char *t; 143*12308Stut int more 1; 144*12308Stut t=s; 145*12308Stut while (more) 146*12308Stut { 147*12308Stut while (t<s+72 && *t) 148*12308Stut t++; 149*12308Stut if (*t) 150*12308Stut { 151*12308Stut while (*t != ' ' && t>(s+25)) 152*12308Stut t--; 153*12308Stut *t=0; 154*12308Stut more=1; 155*12308Stut } 156*12308Stut else 157*12308Stut more=0; 158*12308Stut printf("%s%s\n",ln++ ? " " : " ", s); 159*12308Stut if (rf!=NULL) 160*12308Stut fprintf(rf, "%s\n", s); 161*12308Stut s= ++t; 162*12308Stut } 163*12308Stut } 164*12308Stut 165*12308Stut count(isent, nw, wds) 166*12308Stut char *wds[], *isent; 167*12308Stut { 168*12308Stut int saw[50], ct; 169*12308Stut char sb[BUFSIZ], *s sb; 170*12308Stut int i, c; 171*12308Stut for(i=1; i<nw; i++) 172*12308Stut saw[i]=0; 173*12308Stut while (c = *isent++) 174*12308Stut { 175*12308Stut *s++ = isupper(c) ? tolower(c) : c; 176*12308Stut } 177*12308Stut *s=0; 178*12308Stut s=sb; 179*12308Stut while (*s++) 180*12308Stut { 181*12308Stut if (s[-1]!=' ') continue; 182*12308Stut for(i=1; i<nw; i++) 183*12308Stut { 184*12308Stut if (saw[i])continue; 185*12308Stut if (prefix(wds[i], s)) 186*12308Stut saw[i]=1; 187*12308Stut } 188*12308Stut } 189*12308Stut ct=0; 190*12308Stut for(i=1; i<nw; i++) 191*12308Stut if (saw[i]) 192*12308Stut ct++; 193*12308Stut return(ct); 194*12308Stut } 195*12308Stut 196*12308Stut lcase(s) 197*12308Stut char *s; 198*12308Stut { 199*12308Stut register int c; 200*12308Stut for(; c= *s; s++) 201*12308Stut { 202*12308Stut if (isupper(c)) 203*12308Stut *s= tolower(c); 204*12308Stut } 205*12308Stut } 206*12308Stut 207*12308Stut update( ns, line, kov) 208*12308Stut char *line; 209*12308Stut { 210*12308Stut /* see if sentence array should be updated */ 211*12308Stut int lval 100; 212*12308Stut char *ob; 213*12308Stut struct sf *sp, *least NULL; 214*12308Stut if (kov<=0) return (ns) ; /* no*/ 215*12308Stut if (ns<NS) 216*12308Stut { 217*12308Stut sp=sents+ns; 218*12308Stut strcpy (sp->text = stext[ns], line); 219*12308Stut sp->olap = kov; 220*12308Stut return(ns+1); 221*12308Stut } 222*12308Stut for(sp=sents+ns-1; sp>=sents; sp--) 223*12308Stut { 224*12308Stut if (sp->olap < lval) 225*12308Stut { 226*12308Stut least = sp; 227*12308Stut lval = sp->olap; 228*12308Stut } 229*12308Stut } 230*12308Stut if (kov <= lval) return(ns); 231*12308Stut ob = least->text; 232*12308Stut while (++least < sents+NS) 233*12308Stut { 234*12308Stut (least-1)->text = least->text; 235*12308Stut (least-1)->olap = least->olap; 236*12308Stut } 237*12308Stut sp = sents+NS-1; 238*12308Stut strcpy (sp->text=ob, line); 239*12308Stut sp->olap = kov; 240*12308Stut return(NS); 241*12308Stut } 242