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