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

  1. # include "refer..c"
  2. # define SAME 0
  3. # define NFLAB 2000
  4. # define NLABC 100
  5. static char sig[NLABC];
  6.  
  7. static char bflab[NFLAB];
  8. static char *labtab[NLABC];
  9. static char *lbp bflab;
  10. static char labc[NLABC];
  11. static char stbuff[50];
  12. static int  prevsig;
  13.  
  14. putsig (nf, flds, nref, nstline, endline)
  15.     char *flds[], *nstline, *endline;
  16. {
  17. /* choose signal style */
  18. char t[100], t1[100], t2[100], format[10], *sd;
  19. int another 0;
  20. int addon;
  21. char *stline;
  22. static FILE *fhide 0;
  23. if (labels)
  24.     {
  25.     if (nf==0) /* old */
  26.         sprintf(t, "%s%c", labtab[nref], labc[nref]);
  27.     else
  28.         {
  29.         *t=0;
  30.         if (keywant)
  31.             sprintf(t, "%s", fpar(nf, flds, t1, keywant, 1, 0));
  32.         if (t[0]==0)
  33.             {
  34.             sprintf(format, nmlen>0 ? "%%.%ds%%s" : "%%s%%s", nmlen);
  35.             /* format is %s%s for default labels or %.3s%s eg if wanted */
  36.             sd = fpar(nf, flds, t2, 'D', 1, 0);
  37.             if (dtlen>0)
  38.                 {
  39.                 char *sdb;
  40.                 for(sdb=sd; *sd; sd++);
  41.                 sd = sd-dtlen;
  42.                 if (sd<sdb) sd=sdb;
  43.                 }
  44.             sprintf(t, format, fpar(nf, flds, t1, 'A', 1, 0), sd);
  45.             }
  46.         if (keywant)
  47.             {
  48.             addon=0;
  49.             for(sd=t; *sd; sd++);
  50.             if (*--sd == '-')
  51.                 {
  52.                 addon=1;
  53.                 *sd=0;
  54.                 }
  55.             }
  56.         if (!keywant || addon)
  57.             addch( t, keylet(t, nref));
  58.         }
  59.     }
  60. else 
  61.     {
  62.     if (sort)
  63.         sprintf(t, "%c%d%c", FLAG, nref, FLAG);
  64.     else
  65.         sprintf(t, "%d", nref);
  66.     }
  67. another = prefix (".[", sd=lookat());
  68. if (another && (strcmp(".[\n", sd) != SAME))
  69.     fprintf(stderr, "File %s, line %d- punctuation ignored from: %s", Ifile, Iline, sd);
  70. strcat (sig, t);
  71. # if D1
  72. fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
  73. # endif
  74. trimnl(nstline);
  75. trimnl(endline);
  76. stline=stbuff;
  77. if (prevsig==0)
  78.     {
  79.     strcpy (stline, nstline);
  80.     prevsig=1;
  81.     }
  82. if (stline[2] || endline[2])
  83.     {
  84.     stline += 2;
  85.     endline += 2;
  86.     }
  87. else
  88.     {
  89.     stline  = "\\*([.";
  90.     endline = "\\*(.]";
  91.     }
  92. if (bare==0)
  93.     {
  94.     if (another==0)
  95.         {
  96.         sprintf(t1, "%s%s\%s\n", stline, sig, endline);
  97.         append(t1);
  98.         flout();
  99.         sig[0]=0;
  100.         prevsig=0;
  101.         if (fo == fhide)
  102.             {
  103.             int ch;
  104.             fclose(fhide); fhide= fopen(hidenam, "r");
  105.             fo= ftemp;
  106.             while ((ch = getc(fhide)) != EOF)
  107.                 putc(ch, fo);
  108.             fclose(fhide);
  109.             unlink(hidenam);
  110.             }
  111.         }
  112.     else
  113.         {
  114.         strcat (sig, ",\\|");
  115.         /* hide if need be */
  116.         if (fo == ftemp)
  117.             {
  118.             sprintf(hidenam, "/tmp/rj%dc", getpid());
  119. # if D1
  120. fprintf(stderr, "hiding in %s\n", hidenam);
  121. # endif
  122.             fhide= fopen(hidenam, "w");
  123.             if (fhide==NULL) err("Can't get scratch file %s", hidenam);
  124.             fo = fhide;
  125.             }
  126.         }
  127.     }
  128. if (bare<2)
  129.     if (nf>0) fprintf(fo,".ds [F %s%c",t,sep);
  130. if (bare>0)
  131.     flout();
  132. # if D1
  133. fprintf(stderr, "sig is now %s\n",sig);
  134. # endif
  135. }
  136. fpar (nf, flds, out, c, seq, prepend)
  137.     char *flds[], *out;
  138. {
  139. char *p, *s;
  140. int i, fnd 0;
  141. for(i=0; i<nf; i++)
  142.     if (flds[i][1]==c && ++fnd >= seq)
  143.         {
  144.         if (c=='T' || c == 'J') /* for titles use first word otherwise last */
  145.             {
  146.             p=flds[i]+3;
  147.             if (prefix("A ", p)) p +=2;
  148.             if (prefix("An ", p)) p +=3;
  149.             if (prefix("The ", p)) p+= 4;
  150.             mycpy2(out, p, 20);
  151.             return(out);
  152.             }
  153.         for(s=p= flds[i]+2; *p; p++);
  154.         while (p>s && *p != ' ') p--;
  155.         /* special wart for authors */
  156.         if (c=='A' && (p[-1] == ',' || p[1] =='('))
  157.             {
  158.             p--;
  159.             while (p>s && *p != ' ') p--;
  160.             mycpy (out, p+1);
  161.             }
  162.         else
  163.             strcpy (out, p+1);
  164.         if (c=='A' && prepend)
  165.             initadd(out, flds[i]+2, p);
  166.         return(out);
  167.         }
  168. return(0);
  169. }
  170. putkey(nf, flds, nref, keystr)
  171.     char *flds[], *keystr;
  172. {
  173. char t1[50], *sf;
  174. int ctype, i, count;
  175. fprintf(fo, ".\\\"");
  176. if (nf <= 0)
  177.     fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
  178. else
  179.     {
  180.     while (ctype= *keystr++)
  181.         {
  182.         count = atoi(keystr);
  183.         if (*keystr=='+') count=999;
  184.         if (count<=0) count=1;
  185.         for(i=1; i<=count; i++)
  186.             {
  187.             sf= fpar(nf, flds, t1, ctype, i, 1);
  188.             if (sf==0)
  189.                 break;
  190.             sf = artskp(sf);
  191.             fprintf(fo, "%s%c", sf, '-');
  192.             }
  193.         }
  194.     fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
  195.     }
  196. }
  197. keylet(t, nref)
  198.     char *t;
  199. {
  200. int i;
  201. int x 'a'-1;
  202. for(i=1; i<nref;i++)
  203.     {
  204.     if (strcmp(labtab[i], t) == 0)
  205.         x = labc[i];
  206.     }
  207. strcpy(labtab[nref]=lbp, t);
  208. while (*lbp++);
  209. if (lbp-bflab >NFLAB)
  210.     err("bflab overflow (%d)", NFLAB);
  211. if (nref >NLABC)
  212.     err ("nref in labc overflow (%d)", NLABC);
  213. # ifdef D1
  214. fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab);
  215. # endif
  216. return (labc[nref] = x+1);
  217. }
  218. mycpy(s,t)
  219.     char *s, *t;
  220. {
  221. while (*t && *t != ',' && *t != ' ')
  222.     *s++ = *t++;
  223. *s=0;
  224. }
  225. mycpy2 (s, t, n)
  226.     char *s, *t;
  227. {
  228. int c;
  229. while (n-- && (c= *t++)>0)
  230.     {
  231.     if (c==' ')c= '-';
  232.     *s++ = c;
  233.     }
  234. *s=0;
  235. }
  236. initadd(to, from, stop)
  237.     char *to, *from, *stop;
  238. {
  239.     int c, nalph 1;
  240. while (*to) to++;
  241. while (from<stop)
  242.     {
  243.     c = *from++;
  244.     if (!isalpha(c))
  245.         {
  246.         if (nalph)
  247.             *to++ = '.';
  248.         nalph=0;
  249.         continue;
  250.         }
  251.     if (nalph++ ==0)
  252.         *to++ = c;
  253.     }
  254. *to=0;
  255. }
  256.  
  257. static char *articles[] {"the ", "an ", "a ", 0};
  258. artskp(s)
  259.     char *s;
  260. {
  261. /* skips over initial "a ", "an ", or "the " in s */
  262.     char **p, *r1, *r2;
  263. for(p=articles; *p; p++)
  264.     {
  265.     r2 = s;
  266.     for (r1= *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
  267.         r2++;
  268.     if (*r1==0 && *r2 != 0)
  269.         return(r2);
  270.     }
  271. return(s);
  272. }
  273.