1: # include "refer.h" 2: extern int prevsig; 3: 4: doref(firline) 5: char *firline; 6: { 7: char buff[QLEN], dbuff[TXTLEN]; 8: char line[LLINE]; 9: char *p, **sr, *flds[NFLD], *r; 10: int nf, nr, alph, query 0, chp, digs; 11: int len, skip; 12: 13: /* get query */ 14: buff[0] = dbuff[0] = 0; 15: len = skip = 0; 16: while (input(line)) 17: { 18: if (prefix(".]", line)) 19: break; 20: if (skip) 21: continue; 22: if (control(line[0])) { 23: query=1; 24: len = 0; 25: } 26: if (query) { 27: if ((len += strlen(line)) > TXTLEN) { 28: fprintf(stderr, 29: "in-line citation too long:\n%s",dbuff); 30: skip++; 31: } else { 32: strcat (dbuff, line); 33: } 34: } else { 35: if ((len += strlen(line)) > QLEN) { 36: fprintf(stderr,"citation too long:\n%s",buff); 37: skip++; 38: } else { 39: strcat (buff, line); 40: } 41: } 42: } 43: if (strcmp (buff, "$LIST$\n")==0) 44: { 45: dumpold(); 46: return; 47: } 48: for( p=buff; *p; p++) 49: if (isupper(*p)) *p |= 040; 50: alph = digs =0; 51: for(p=buff; *p; p++) 52: { 53: if (isalpha(chp = *p)) alph++; 54: else 55: if (isdigit(*p)) digs++; 56: else 57: { 58: *p=0; 59: if ( (alph+digs<3) || common(p-alph)) 60: { 61: r = p-alph; 62: while (r < p) 63: *r++ = ' '; 64: } 65: if ( alph==0 && digs >0) 66: { 67: r = p-digs; 68: if (digs != 4 || (atoi(r)/100 != 19)) 69: { 70: while (r<p) 71: *r++ = ' '; 72: } 73: } 74: *p=' '; 75: alph = digs = 0; 76: } 77: } 78: text[0]=0; 79: nfound = 0; 80: sinput = buff; 81: if (buff[0]) { /* do not search if no query */ 82: for( sr= data; sr < search; sr++) 83: { 84: Index = *sr; 85: huntmain (Index); 86: if (nfound > 0) break; 87: } 88: if (nfound == 0) { 89: fprintf (stderr, "%s: No such paper '%s'\n", 90: Ifile,buff); 91: if (prevsig) 92: /* terminate signal */ 93: putsig (0, 0, 0, firline, line); 94: return; 95: } 96: if (endpush) 97: if (nr = chkdup(tagout)) 98: { 99: if (bare<2) 100: putsig (0, 0, nr, firline, line); 101: return; 102: } 103: } 104: nf = tabs(flds, text, NFLD); 105: nf += tabs(flds+nf, dbuff,NFLD-nf); 106: refnum++; 107: if (sort) putkey (nf, flds, refnum, keystr); 108: if (bare<2) 109: putsig (nf, flds, refnum, firline, line); 110: else 111: flout(); 112: putref (nf, flds); 113: } 114: title( buff ) 115: char *buff; 116: { 117: register char *q, *t; 118: int nl; 119: 120: nl = 1; 121: for( q=buff; *q; q++) 122: { 123: if (nl && (q[0] == '.' || q[0] == '%') && q[1] == 'T') 124: { 125: q += 3; 126: for (t=q; *t && *t != '\n'; t++); 127: *t = 0; 128: fprintf(stderr, "%.70s\n", q); 129: q=0; 130: break; 131: } 132: nl = *q == '\n'; 133: } 134: if (q) 135: fprintf(stderr, "<No title>\n"); 136: } 137: 138: control(c) 139: { 140: if (c=='.') return(1); 141: if (c=='%') return(1); 142: return(0); 143: }