|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)what2.c 4.1 (Berkeley) 5/6/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.