home *** CD-ROM | disk | FTP | other *** search
- # 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
- }
- 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};
- 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);
- }
-