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