|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.