home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / refer / what2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  3.4 KB  |  230 lines

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