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