📄 refer2.c
字号:
# include "refer..c"extern FILE *in;# define NFLD 30# define TLEN 400char one[ANSLEN];int onelen ANSLEN;static char dr [100] "";doref(firline) char *firline;{char buff[QLEN], dbuff[3*QLEN], answer[ANSLEN], temp[TLEN];char line[LLINE];char *p, **sr, *flds[NFLD], *r;int nf, nr, alph, query 0, chp, digs;/* get query */buff[0] = dbuff[0] = 0;while (input(line)) { if (prefix(".]", line)) break; if (control(line[0])) query=1; strcat (query ? dbuff: buff, line); if (strlen(buff)>QLEN) err("buff too big (%d)", strlen(buff)); assert (strlen(dbuff) <3*QLEN); }if (strcmp (buff, "$LIST$\n")==0) {# if D1fprintf(stderr, "dump sorted list\n");# endif assert ( dbuff[0]==0); dumpold(); return; }answer[0] = 0;# ifdef D1 fprintf(stderr, "query is %s\n",buff);# endiffor( p=buff; *p; p++) { if (isupper(*p)) *p |= 040; }alph = digs =0;for(p=buff; *p; p++) { if (isalpha(chp = *p)) alph++; else if (isdigit(*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 D1fprintf(stderr, "number, %d long, text is %s\n",digs,r);# endif if (digs != 4 || (atoi(r)/100 != 19)) { while (r<p) *r++ = ' '; } } *p=' '; alph = digs = 0; } }# ifdef D1 fprintf(stderr, "query translated to %s\n", buff);# endifone[0]=0;if (buff[0]) /* do not search if no query */for( sr= data; sr < search; sr++) {# ifdef D1 fprintf(stderr, "now searching %s\n", *sr);# endif temp[0]=0; corout (buff, temp, "hunt", *sr, TLEN); assert (strlen(temp)<TLEN); if (strlen(temp)+strlen(answer)>LLINE) err("Accumulated answers too large",0); strcat (answer, temp); if (strlen(answer)>LLINE) err("answer too long (%d)", strlen(answer)); if (newline(answer) > 0) break; }# if D1fprintf(stderr, "answer:\n%s****\n", answer);# endifassert (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 for '%s'\n", trimnl(buff)); choices(answer); p = buff; while (*p != '\n') p++; *++p=0; case 1:# ifdef D1 fprintf(stderr, "found one\n");# endif if (endpush) if (nr = chkdup(answer)) { if (bare<2) putsig (0, flds, nr, firline, line); return; }# if D1 fprintf(stderr, "one[0] was %o\n",one[0]);# endif if (one[0]==0) corout (answer, one, "deliv", dr, QLEN);# if D1 fprintf(stderr, "one now %o\n",one[0]);# endif break; }assert (strlen(buff)<QLEN);assert (strlen(one)<ANSLEN);nf = tabs(flds, one);nf += tabs(flds+nf, dbuff);# if D1fprintf(stderr, "one %.20s dbuff %.20s nf %d\n",one,dbuff, nf);# endifassert (nf < NFLD);refnum++;if (sort) putkey (nf, flds, refnum, keystr);if (bare<2) putsig (nf, flds, refnum, firline, line);else flout();# if D1fprintf(stderr, "put signal\n");# endifputref (nf, flds);# if D1fprintf(stderr, "put ref\n");# endif}newline(s) char *s;{int k 0, c;while (c = *s++) if (c == '\n') k++;return(k);}choices( buff ) char *buff;{char ob[LLINE], *p, *r, *q, *t;int nl;for(r=p= buff; *p; p++) { if (*p == '\n') { *p++ = 0; { corout (r, ob, "deliv", dr, LLINE); nl = 1; for( q=ob; *q; q++) { if (nl && (q[0] == '.' || q[0] == '%') && q[1] == 'T') { q += 3; for (t=q; *t && *t != '\n'; t++); *t = 0; fprintf(stderr, "%.70s\n", q); q=0; break; } nl = *q == '\n'; } if (q) fprintf(stderr, "??? at %s\n",r); } r=p; } }}control(c) { if (c=='.') return(1); if (c=='%') return(1); return(0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -