|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)refer2.c 4.2 (Berkeley) 6/5/84"; ! 3: #endif ! 4: ! 5: #include "refer..c" ! 6: #define NFLD 30 ! 7: #define TLEN 512 ! 8: ! 9: extern FILE *in; ! 10: char one[ANSLEN]; ! 11: int onelen = ANSLEN; ! 12: static char dr [100] = ""; ! 13: ! 14: doref(line1) ! 15: char *line1; ! 16: { ! 17: char buff[QLEN], dbuff[3*QLEN]; ! 18: char answer[ANSLEN], temp[TLEN], line[BUFSIZ]; ! 19: char *p, **sr, *flds[NFLD], *r; ! 20: int stat, nf, nr, query = 0, alph, digs; ! 21: ! 22: again: ! 23: buff[0] = dbuff[0] = NULL; ! 24: if (biblio && Iline == 1 && line1[0] == '%') ! 25: strcat(dbuff, line1); ! 26: while (input(line)) { /* get query */ ! 27: Iline++; ! 28: if (prefix(".]", line)) ! 29: break; ! 30: if (biblio && line[0] == '\n') ! 31: break; ! 32: if (biblio && line[0] == '%' && line[1] == *convert) ! 33: break; ! 34: if (control(line[0])) ! 35: query = 1; ! 36: strcat(query ? dbuff : buff, line); ! 37: if (strlen(buff) > QLEN) ! 38: err("query too long (%d)", strlen(buff)); ! 39: if (strlen(dbuff) > 3 * QLEN) ! 40: err("record at line %d too long", Iline-1); ! 41: } ! 42: if (biblio && line[0] == '\n' && feof(in)) ! 43: return; ! 44: if (strcmp(buff, "$LIST$\n")==0) { ! 45: assert (dbuff[0] == 0); ! 46: dumpold(); ! 47: return; ! 48: } ! 49: answer[0] = 0; ! 50: for (p = buff; *p; p++) { ! 51: if (isupper(*p)) ! 52: *p |= 040; ! 53: } ! 54: alph = digs = 0; ! 55: for (p = buff; *p; p++) { ! 56: if (isalpha(*p)) ! 57: alph++; ! 58: else ! 59: if (isdigit(*p)) ! 60: digs++; ! 61: else { ! 62: *p = 0; ! 63: if ((alph+digs < 3) || common(p-alph)) { ! 64: r = p-alph; ! 65: while (r < p) ! 66: *r++ = ' '; ! 67: } ! 68: if (alph == 0 && digs > 0) { ! 69: r = p-digs; ! 70: if (digs != 4 || atoi(r)/100 != 19) { ! 71: while (r < p) ! 72: *r++ = ' '; ! 73: } ! 74: } ! 75: *p = ' '; ! 76: alph = digs = 0; ! 77: } ! 78: } ! 79: one[0] = 0; ! 80: if (buff[0]) { /* do not search if no query */ ! 81: for (sr = rdata; sr < search; sr++) { ! 82: temp[0] = 0; ! 83: corout(buff, temp, "hunt", *sr, TLEN); ! 84: assert(strlen(temp) < TLEN); ! 85: if (strlen(temp)+strlen(answer) > BUFSIZ) ! 86: err("Accumulated answers too large",0); ! 87: strcat(answer, temp); ! 88: if (strlen(answer)>BUFSIZ) ! 89: err("answer too long (%d)", strlen(answer)); ! 90: if (newline(answer) > 0) ! 91: break; ! 92: } ! 93: } ! 94: assert(strlen(one) < ANSLEN); ! 95: assert(strlen(answer) < ANSLEN); ! 96: if (buff[0]) ! 97: switch (newline(answer)) { ! 98: case 0: ! 99: fprintf(stderr, "No such paper: %s\n", buff); ! 100: return; ! 101: default: ! 102: fprintf(stderr, "Too many hits: %s\n", trimnl(buff)); ! 103: choices(answer); ! 104: p = buff; ! 105: while (*p != '\n') ! 106: p++; ! 107: *++p = 0; ! 108: case 1: ! 109: if (endpush) ! 110: if (nr = chkdup(answer)) { ! 111: if (bare < 2) { ! 112: nf = tabs(flds, one); ! 113: nf += tabs(flds+nf, dbuff); ! 114: assert(nf < NFLD); ! 115: putsig(nf,flds,nr,line1,line,0); ! 116: } ! 117: return; ! 118: } ! 119: if (one[0] == 0) ! 120: corout(answer, one, "deliv", dr, QLEN); ! 121: break; ! 122: } ! 123: assert(strlen(buff) < QLEN); ! 124: assert(strlen(one) < ANSLEN); ! 125: nf = tabs(flds, one); ! 126: nf += tabs(flds+nf, dbuff); ! 127: assert(nf < NFLD); ! 128: refnum++; ! 129: if (sort) ! 130: putkey(nf, flds, refnum, keystr); ! 131: if (bare < 2) ! 132: putsig(nf, flds, refnum, line1, line, 1); ! 133: else ! 134: flout(); ! 135: putref(nf, flds); ! 136: if (biblio && line[0] == '\n') ! 137: goto again; ! 138: if (biblio && line[0] == '%' && line[1] == *convert) ! 139: fprintf(fo, "%s%c%s", convert+1, sep, line+3); ! 140: } ! 141: ! 142: newline(s) ! 143: char *s; ! 144: { ! 145: int k = 0, c; ! 146: ! 147: while (c = *s++) ! 148: if (c == '\n') ! 149: k++; ! 150: return(k); ! 151: } ! 152: ! 153: choices(buff) ! 154: char *buff; ! 155: { ! 156: char ob[BUFSIZ], *p, *r, *q, *t; ! 157: int nl; ! 158: ! 159: for (r = p = buff; *p; p++) { ! 160: if (*p == '\n') { ! 161: *p++ = 0; ! 162: corout(r, ob, "deliv", dr, BUFSIZ); ! 163: nl = 1; ! 164: for (q = ob; *q; q++) { ! 165: if (nl && (q[0]=='.'||q[0]=='%') && q[1]=='T') { ! 166: q += 3; ! 167: for (t = q; *t && *t != '\n'; t++) ! 168: ; ! 169: *t = 0; ! 170: fprintf(stderr, "%.70s\n", q); ! 171: q = 0; ! 172: break; ! 173: } ! 174: nl = *q == '\n'; ! 175: } ! 176: if (q) ! 177: fprintf(stderr, "??? at %s\n",r); ! 178: r=p; ! 179: } ! 180: } ! 181: } ! 182: ! 183: control(c) ! 184: { ! 185: if (c == '.') ! 186: return(1); ! 187: if (c == '%') ! 188: return(1); ! 189: return(0); ! 190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.