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