Bell 32V development
authorTom London <tbl@research.uucp>
Fri, 19 Jan 1979 05:27:17 +0000 (00:27 -0500)
committerTom London <tbl@research.uucp>
Fri, 19 Jan 1979 05:27:17 +0000 (00:27 -0500)
Work on file usr/src/cmd/refer/refer5.c

Co-Authored-By: John Reiser <jfr@research.uucp>
Synthesized-from: 32v

usr/src/cmd/refer/refer5.c [new file with mode: 0644]

diff --git a/usr/src/cmd/refer/refer5.c b/usr/src/cmd/refer/refer5.c
new file mode 100644 (file)
index 0000000..748fe91
--- /dev/null
@@ -0,0 +1,274 @@
+# include "refer..c"
+# define SAME 0
+# define NFLAB 2000
+# define NLABC 100
+static char sig[NLABC];
+
+static char bflab[NFLAB];
+static char *labtab[NLABC];
+static char *lbp = bflab;
+static char labc[NLABC];
+static char stbuff[50];
+static int  prevsig;
+
+putsig (nf, flds, nref, nstline, endline)
+       char *flds[], *nstline, *endline;
+{
+/* choose signal style */
+char t[100], t1[100], t2[100], format[10], *sd;
+int another = 0;
+int addon;
+char *stline;
+static FILE *fhide = 0;
+if (labels)
+       {
+       if (nf==0) /* old */
+               sprintf(t, "%s%c", labtab[nref], labc[nref]);
+       else
+               {
+               *t=0;
+               if (keywant)
+                       sprintf(t, "%s", fpar(nf, flds, t1, keywant, 1, 0));
+               if (t[0]==0)
+                       {
+                       sprintf(format, nmlen>0 ? "%%.%ds%%s" : "%%s%%s", nmlen);
+                       /* format is %s%s for default labels or %.3s%s eg if wanted */
+                       sd = fpar(nf, flds, t2, 'D', 1, 0);
+                       if (dtlen>0)
+                               {
+                               char *sdb;
+                               for(sdb=sd; *sd; sd++);
+                               sd = sd-dtlen;
+                               if (sd<sdb) sd=sdb;
+                               }
+                       sprintf(t, format, fpar(nf, flds, t1, 'A', 1, 0), sd);
+                       }
+               if (keywant)
+                       {
+                       addon=0;
+                       for(sd=t; *sd; sd++);
+                       if (*--sd == '-')
+                               {
+                               addon=1;
+                               *sd=0;
+                               }
+                       }
+               if (!keywant || addon)
+                       addch( t, keylet(t, nref));
+               }
+       }
+else 
+       {
+       if (sort)
+               sprintf(t, "%c%d%c", FLAG, nref, FLAG);
+       else
+               sprintf(t, "%d", nref);
+       }
+another = prefix (".[", sd=lookat());
+if (another && (strcmp(".[\n", sd) != SAME))
+       fprintf(stderr, "File %s, line %d- punctuation ignored from: %s", Ifile, Iline, sd);
+strcat (sig, t);
+# if D1
+fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
+# endif
+trimnl(nstline);
+trimnl(endline);
+stline=stbuff;
+if (prevsig==0)
+       {
+       strcpy (stline, nstline);
+       prevsig=1;
+       }
+if (stline[2] || endline[2])
+       {
+       stline += 2;
+       endline += 2;
+       }
+else
+       {
+       stline  = "\\*([.";
+       endline = "\\*(.]";
+       }
+if (bare==0)
+       {
+       if (another==0)
+               {
+               sprintf(t1, "%s%s\%s\n", stline, sig, endline);
+               append(t1);
+               flout();
+               sig[0]=0;
+               prevsig=0;
+               if (fo == fhide)
+                       {
+                       int ch;
+                       fclose(fhide); fhide= fopen(hidenam, "r");
+                       fo= ftemp;
+                       while ((ch = getc(fhide)) != EOF)
+                               putc(ch, fo);
+                       fclose(fhide);
+                       unlink(hidenam);
+                       }
+               }
+       else
+               {
+               strcat (sig, ",\\|");
+               /* hide if need be */
+               if (fo == ftemp)
+                       {
+                       sprintf(hidenam, "/tmp/rj%dc", getpid());
+# if D1
+fprintf(stderr, "hiding in %s\n", hidenam);
+# endif
+                       fhide= fopen(hidenam, "w");
+                       if (fhide==NULL) err("Can't get scratch file %s", hidenam);
+                       fo = fhide;
+                       }
+               }
+       }
+if (bare<2)
+       if (nf>0) fprintf(fo,".ds [F %s%c",t,sep);
+if (bare>0)
+       flout();
+# if D1
+fprintf(stderr, "sig is now %s\n",sig);
+# endif
+}
+char *
+fpar (nf, flds, out, c, seq, prepend)
+       char *flds[], *out;
+{
+char *p, *s;
+int i, fnd = 0;
+for(i=0; i<nf; i++)
+       if (flds[i][1]==c && ++fnd >= seq)
+               {
+               if (c=='T' || c == 'J') /* for titles use first word otherwise last */
+                       {
+                       p=flds[i]+3;
+                       if (prefix("A ", p)) p +=2;
+                       if (prefix("An ", p)) p +=3;
+                       if (prefix("The ", p)) p+= 4;
+                       mycpy2(out, p, 20);
+                       return(out);
+                       }
+               for(s=p= flds[i]+2; *p; p++);
+               while (p>s && *p != ' ') p--;
+               /* special wart for authors */
+               if (c=='A' && (p[-1] == ',' || p[1] =='('))
+                       {
+                       p--;
+                       while (p>s && *p != ' ') p--;
+                       mycpy (out, p+1);
+                       }
+               else
+                       strcpy (out, p+1);
+               if (c=='A' && prepend)
+                       initadd(out, flds[i]+2, p);
+               return(out);
+               }
+return(0);
+}
+putkey(nf, flds, nref, keystr)
+       char *flds[], *keystr;
+{
+char t1[50], *sf;
+int ctype, i, count;
+fprintf(fo, ".\\\"");
+if (nf <= 0)
+       fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
+else
+       {
+       while (ctype= *keystr++)
+               {
+               count = atoi(keystr);
+               if (*keystr=='+') count=999;
+               if (count<=0) count=1;
+               for(i=1; i<=count; i++)
+                       {
+                       sf= fpar(nf, flds, t1, ctype, i, 1);
+                       if (sf==0)
+                               break;
+                       sf = artskp(sf);
+                       fprintf(fo, "%s%c", sf, '-');
+                       }
+               }
+       fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
+       }
+}
+keylet(t, nref)
+       char *t;
+{
+int i;
+int x = 'a'-1;
+for(i=1; i<nref;i++)
+       {
+       if (strcmp(labtab[i], t) == 0)
+               x = labc[i];
+       }
+strcpy(labtab[nref]=lbp, t);
+while (*lbp++);
+if (lbp-bflab >NFLAB)
+       err("bflab overflow (%d)", NFLAB);
+if (nref >NLABC)
+       err ("nref in labc overflow (%d)", NLABC);
+# ifdef D1
+fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab);
+# endif
+return (labc[nref] = x+1);
+}
+mycpy(s,t)
+       char *s, *t;
+{
+while (*t && *t != ',' && *t != ' ')
+       *s++ = *t++;
+*s=0;
+}
+mycpy2 (s, t, n)
+       char *s, *t;
+{
+int c;
+while (n-- && (c= *t++)>0)
+       {
+       if (c==' ')c= '-';
+       *s++ = c;
+       }
+*s=0;
+}
+initadd(to, from, stop)
+       char *to, *from, *stop;
+{
+       int c, nalph = 1;
+while (*to) to++;
+while (from<stop)
+       {
+       c = *from++;
+       if (!isalpha(c))
+               {
+               if (nalph)
+                       *to++ = '.';
+               nalph=0;
+               continue;
+               }
+       if (nalph++ ==0)
+               *to++ = c;
+       }
+*to=0;
+}
+
+static char *articles[] = {"the ", "an ", "a ", 0};
+char *
+artskp(s)
+       char *s;
+{
+/* skips over initial "a ", "an ", or "the " in s */
+       char **p, *r1, *r2;
+for(p=articles; *p; p++)
+       {
+       r2 = s;
+       for (r1= *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
+               r2++;
+       if (*r1==0 && *r2 != 0)
+               return(r2);
+       }
+return(s);
+}