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

Defined functions

artskp defined in line 309; used 2 times
fpar defined in line 161; used 7 times
initadd defined in line 284; used 1 times
keylet defined in line 242; used 1 times
  • in line 67
mycpy defined in line 263; used 1 times
mycpy2 defined in line 271; used 1 times
putkey defined in line 205; used 1 times
putsig defined in line 18; used 2 times
tokeytab defined in line 234; used 2 times

Defined variables

articles defined in line 305; used 1 times
bflab defined in line 11; used 3 times
labc defined in line 14; used 4 times
labtab defined in line 12; used 4 times
lbp defined in line 13; used 4 times
prevsig defined in line 16; used 3 times
sccsid defined in line 2; never used
sig defined in line 10; used 9 times
stbuff defined in line 15; used 1 times
  • in line 89

Defined macros

NFLAB defined in line 7; used 4 times
NLABC defined in line 8; used 4 times
SAME defined in line 6; used 1 times
  • in line 78
Last modified: 1986-04-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1850
Valid CSS Valid XHTML 1.0 Strict