void doref(char *line1) { char buff[QLEN], dbuff[3*QLEN]; char answer[ANSLEN], temp[TLEN], line[BUFSIZ]; char *p, **sr, *flds[NFLD], *r; int nf, nr, query = 0, alph, digs; again: buff[0] = dbuff[0] = 0; if (biblio && Iline == 1 && line1[0] == '%') n_strcat(dbuff, line1, sizeof(dbuff)); while (input(line, sizeof(line))) { /* get query */ Iline++; if (prefix(line, ".]")) break; if (biblio && line[0] == '\n') break; if (biblio && line[0] == '%' && line[1] == *convert) break; if (control(line[0])) query = 1; n_strcat(query ? dbuff : buff, line, query ? sizeof(dbuff) : sizeof(buff)); if (strlen(buff) > QLEN) err("query too long (%d)", strlen(buff)); if (strlen(dbuff) > 3 * QLEN) err("record at line %d too long", Iline-1); } if (biblio && line[0] == '\n' && feof(in)) return; if (strcmp(buff, "$LIST$\n")==0) { assert (dbuff[0] == 0); dumpold(); return; } answer[0] = 0; for (p = buff; *p; p++) { if (isupper((int)*p)) *p |= 040; } alph = digs = 0; for (p = buff; *p; p++) { if (isalpha((int)*p)) alph++; else if (isdigit((int)*p)) digs++; else { *p = 0; if ((alph+digs < 3) || common(p-alph)) { r = p-alph; while (r < p) *r++ = ' '; } if (alph == 0 && digs > 0) { r = p-digs; if (digs != 4 || atoi(r)/100 != 19) { while (r < p) *r++ = ' '; } } *p = ' '; alph = digs = 0; } } one[0] = 0; if (buff[0]) { /* do not search if no query */ for (sr = rdata; sr < search; sr++) { temp[0] = 0; corout(buff, temp, "hunt", *sr, TLEN); assert(strlen(temp) < TLEN); if (strlen(temp)+strlen(answer) > BUFSIZ) err("Accumulated answers too large",0); n_strcat(answer, temp, sizeof(answer)); if (strlen(answer)>BUFSIZ) err("answer too long (%d)", strlen(answer)); if (newline(answer) > 0) break; } } assert(strlen(one) < ANSLEN); assert(strlen(answer) < ANSLEN); if (buff[0]) switch (newline(answer)) { case 0: fprintf(stderr, "No such paper: %s\n", buff); return; default: fprintf(stderr, "Too many hits: %s\n", trimnl(buff)); choices(answer); p = buff; while (*p != '\n') p++; *++p = 0; case 1: if (endpush) if ((nr = chkdup(answer))) { if (bare < 2) { nf = tabs(flds, one); nf += tabs(flds+nf, dbuff); assert(nf < NFLD); putsig(nf,flds,nr,line1,line,0); } return; } if (one[0] == 0) corout(answer, one, "deliv", dr, QLEN); break; } assert(strlen(buff) < QLEN); assert(strlen(one) < ANSLEN); nf = tabs(flds, one); nf += tabs(flds+nf, dbuff); assert(nf < NFLD); refnum++; if (sort) putkey(nf, flds, refnum, keystr); if (bare < 2) putsig(nf, flds, refnum, line1, line, 1); else flout(); putref(nf, flds); if (biblio && line[0] == '\n') goto again; if (biblio && line[0] == '%' && line[1] == *convert) fprintf(fo, "%s%c%s", convert+1, sep, line+3); }
int main(int argc,char **argv) /* process command-line arguments */ { char line[BUFSIZ], *s; int nodeflt = 0; in = stdin; fo = stdout; ftemp = stdout; signals(); while (argc > 1 && argv[1][0] == '-') { switch(argv[1][1]) { case 'e': endpush++; break; case 's': sort++; endpush = 1; if (argv[1][2]) keystr = argv[1]+2; break; case 'l': labels++; s = argv[1]+2; nmlen = atoi(s); while (*s) if (*s++ == ',') break; dtlen = atoi(s); break; case 'k': keywant = (argv[1][2] ? argv[1][2] : 'L'); labels++; break; case 'n': nodeflt = 1; break; case 'p': argc--; argv++; *search++ = argv[1]; if (search-rdata > NSERCH) err("too many -p options (%d)", NSERCH); break; case 'a': authrev = atoi(argv[1]+2); if (authrev<=0) authrev = 1000; break; case 'b': bare = (argv[1][2] == '1') ? 1 : 2; break; case 'c': smallcaps = argv[1]+2; break; case 'f': refnum = atoi(argv[1]+2) - 1; break; case 'B': biblio++; bare = 2; if (argv[1][2]) convert = argv[1]+2; break; case 'S': science++; labels = 1; break; case 'P': postpunct++; break; } argc--; argv++; } if (getenv("REFER") != NULL) *search++ = getenv("REFER"); else if (nodeflt == 0) *search++ = REFDIR "/papers/Ind"; if (sort && !labels) { sprintf(ofile, "/tmp/rj%db", (int)getpid()); ftemp = fopen(ofile, "w"); if (ftemp == NULL) { fprintf(stderr, "Can't open scratch file\n"); exit(1); } } if (endpush) { sprintf(tfile, "/tmp/rj%da", (int)getpid()); fo = fopen(tfile, "w"); if (fo == NULL) { fo = ftemp; fprintf(stderr, "Can't open scratch file"); } sep = 002; /* separate records without confusing sort..*/ } else fo = ftemp; do { if (argc > 1) { fclose(in); Iline = 0; in = fopen(Ifile = argv[1], "r"); argc--; argv++; if (in == NULL) { err("Can't read %s", Ifile); continue; } } while (input(line)) { Iline++; if (biblio && *line == '\n') doref(line); else if (biblio && Iline == 1 && *line == '%') doref(line); else if (!prefix(".[", line)) output(line); else doref(line); } } while (argc > 1); if (endpush && fo != NULL) dumpold(); output(""); if (sort && !labels) recopy1(ofile); clfgrep(); cleanup(); return 0; }