Annotation of 43BSD/usr.bin/refer/refer2.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)refer2.c    4.2 (Berkeley) 6/5/84";
                      3: #endif
                      4: 
                      5: #include "refer..c"
                      6: #define NFLD 30
                      7: #define TLEN 512
                      8: 
                      9: extern FILE *in;
                     10: char one[ANSLEN];
                     11: int onelen = ANSLEN;
                     12: static char dr [100] = "";
                     13: 
                     14: doref(line1)
                     15: char *line1;
                     16: {
                     17:        char buff[QLEN], dbuff[3*QLEN];
                     18:        char answer[ANSLEN], temp[TLEN], line[BUFSIZ];
                     19:        char *p, **sr, *flds[NFLD], *r;
                     20:        int stat, nf, nr, query = 0, alph, digs;
                     21: 
                     22:    again:
                     23:        buff[0] = dbuff[0] = NULL;
                     24:        if (biblio && Iline == 1 && line1[0] == '%')
                     25:                strcat(dbuff, line1);
                     26:        while (input(line)) {           /* get query */
                     27:                Iline++;
                     28:                if (prefix(".]", line))
                     29:                        break;
                     30:                if (biblio && line[0] == '\n')
                     31:                        break;
                     32:                if (biblio && line[0] == '%' && line[1] == *convert)
                     33:                        break;
                     34:                if (control(line[0]))
                     35:                        query = 1;
                     36:                strcat(query ? dbuff : buff, line);
                     37:                if (strlen(buff) > QLEN)
                     38:                        err("query too long (%d)", strlen(buff));
                     39:                if (strlen(dbuff) > 3 * QLEN)
                     40:                        err("record at line %d too long", Iline-1);
                     41:        }
                     42:        if (biblio && line[0] == '\n' && feof(in))
                     43:                return;
                     44:        if (strcmp(buff, "$LIST$\n")==0) {
                     45:                assert (dbuff[0] == 0);
                     46:                dumpold();
                     47:                return;
                     48:        }
                     49:        answer[0] = 0;
                     50:        for (p = buff; *p; p++) {
                     51:                if (isupper(*p))
                     52:                        *p |= 040;
                     53:        }
                     54:        alph = digs = 0;
                     55:        for (p = buff; *p; p++) {
                     56:                if (isalpha(*p))
                     57:                        alph++;
                     58:                else
                     59:                        if (isdigit(*p))
                     60:                                digs++;
                     61:                        else {
                     62:                                *p = 0;
                     63:                                if ((alph+digs < 3) || common(p-alph)) {
                     64:                                        r = p-alph;
                     65:                                        while (r < p)
                     66:                                                *r++ = ' ';
                     67:                                }
                     68:                                if (alph == 0 && digs > 0) {
                     69:                                        r = p-digs;
                     70:                                        if (digs != 4 || atoi(r)/100 != 19) { 
                     71:                                                while (r < p)
                     72:                                                        *r++ = ' ';
                     73:                                        }
                     74:                                }
                     75:                                *p = ' ';
                     76:                                alph = digs = 0;
                     77:                        }
                     78:        }
                     79:        one[0] = 0;
                     80:        if (buff[0]) {  /* do not search if no query */
                     81:                for (sr = rdata; sr < search; sr++) {
                     82:                        temp[0] = 0;
                     83:                        corout(buff, temp, "hunt", *sr, TLEN);
                     84:                        assert(strlen(temp) < TLEN);
                     85:                        if (strlen(temp)+strlen(answer) > BUFSIZ)
                     86:                                err("Accumulated answers too large",0);
                     87:                        strcat(answer, temp);
                     88:                        if (strlen(answer)>BUFSIZ)
                     89:                                err("answer too long (%d)", strlen(answer));
                     90:                        if (newline(answer) > 0)
                     91:                                break;
                     92:                }
                     93:        }
                     94:        assert(strlen(one) < ANSLEN);
                     95:        assert(strlen(answer) < ANSLEN);
                     96:        if (buff[0])
                     97:                switch (newline(answer)) {
                     98:                case 0:
                     99:                        fprintf(stderr, "No such paper: %s\n", buff);
                    100:                        return;
                    101:                default:
                    102:                        fprintf(stderr, "Too many hits: %s\n", trimnl(buff));
                    103:                        choices(answer);
                    104:                        p = buff;
                    105:                        while (*p != '\n')
                    106:                                p++;
                    107:                        *++p = 0;
                    108:                case 1:
                    109:                        if (endpush)
                    110:                                if (nr = chkdup(answer)) {
                    111:                                        if (bare < 2) {
                    112:                                                nf = tabs(flds, one);
                    113:                                                nf += tabs(flds+nf, dbuff);
                    114:                                                assert(nf < NFLD);
                    115:                                                putsig(nf,flds,nr,line1,line,0);
                    116:                                        }
                    117:                                        return;
                    118:                                }
                    119:                        if (one[0] == 0)
                    120:                                corout(answer, one, "deliv", dr, QLEN);
                    121:                        break;
                    122:                }
                    123:        assert(strlen(buff) < QLEN);
                    124:        assert(strlen(one) < ANSLEN);
                    125:        nf = tabs(flds, one);
                    126:        nf += tabs(flds+nf, dbuff);
                    127:        assert(nf < NFLD);
                    128:        refnum++;
                    129:        if (sort)
                    130:                putkey(nf, flds, refnum, keystr);
                    131:        if (bare < 2)
                    132:                putsig(nf, flds, refnum, line1, line, 1);
                    133:        else
                    134:                flout();
                    135:        putref(nf, flds);
                    136:        if (biblio && line[0] == '\n')
                    137:                goto again;
                    138:        if (biblio && line[0] == '%' && line[1] == *convert)
                    139:                fprintf(fo, "%s%c%s", convert+1, sep, line+3);
                    140: }
                    141: 
                    142: newline(s)
                    143: char *s;
                    144: {
                    145:        int k = 0, c;
                    146: 
                    147:        while (c = *s++)
                    148:                if (c == '\n')
                    149:                        k++;
                    150:        return(k);
                    151: }
                    152: 
                    153: choices(buff)
                    154: char *buff;
                    155: {
                    156:        char ob[BUFSIZ], *p, *r, *q, *t;
                    157:        int nl;
                    158: 
                    159:        for (r = p = buff; *p; p++) {
                    160:                if (*p == '\n') {
                    161:                        *p++ = 0;
                    162:                        corout(r, ob, "deliv", dr, BUFSIZ);
                    163:                        nl = 1;
                    164:                        for (q = ob; *q; q++) {
                    165:                                if (nl && (q[0]=='.'||q[0]=='%') && q[1]=='T') {
                    166:                                        q += 3;
                    167:                                        for (t = q; *t && *t != '\n'; t++)
                    168:                                                ;
                    169:                                        *t = 0;
                    170:                                        fprintf(stderr, "%.70s\n", q);
                    171:                                        q = 0; 
                    172:                                        break;
                    173:                                }
                    174:                                nl = *q == '\n';
                    175:                        }
                    176:                        if (q)
                    177:                                fprintf(stderr, "??? at %s\n",r);
                    178:                        r=p;
                    179:                }
                    180:        }
                    181: }
                    182: 
                    183: control(c)
                    184: {
                    185:        if (c == '.')
                    186:                return(1);
                    187:        if (c == '%')
                    188:                return(1);
                    189:        return(0);
                    190: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.