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: }

Defined functions

count defined in line 165; used 1 times
  • in line 52
describe defined in line 17; used 1 times
gsent defined in line 62; used 1 times
  • in line 29
lcase defined in line 196; used 1 times
  • in line 28
output defined in line 138; used 3 times
prefix defined in line 128; used 5 times
update defined in line 207; used 1 times
  • in line 52

Defined variables

oldc defined in line 60; used 5 times
sccsid defined in line 2; never used
sents defined in line 13; used 7 times
sp defined in line 14; used 17 times
state defined in line 59; used 7 times
stext defined in line 15; used 1 times

Defined struct's

sf defined in line 9; used 4 times

Defined macros

NS defined in line 7; used 6 times
Last modified: 1987-02-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 751
Valid CSS Valid XHTML 1.0 Strict