Annotation of 42BSD/usr.bin/refer/refer5.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char *sccsid = "@(#)refer5.c    4.2 (Berkeley) 7/18/83";
                      3: #endif
                      4: 
                      5: #include "refer..c"
                      6: #define SAME 0
                      7: #define NFLAB 2000
                      8: #define NLABC 100
                      9: 
                     10: static char sig[NLABC];
                     11: static char bflab[NFLAB];
                     12: static char *labtab[NLABC];
                     13: static char *lbp = bflab;
                     14: static char labc[NLABC];
                     15: static char stbuff[50];
                     16: static int  prevsig;
                     17: 
                     18: putsig (nf, flds, nref, nstline, endline)      /* choose signal style */
                     19: char *flds[], *nstline, *endline;
                     20: {
                     21:        char t[100], t1[100], t2[100], format[10], *sd, *stline;
                     22:        int addon, another = 0;
                     23:        static FILE *fhide = 0;
                     24:        int i;
                     25:        char tag;
                     26: 
                     27:        if (labels) {
                     28:                if (nf == 0)    /* old */
                     29:                        sprintf(t, "%s%c", labtab[nref], labc[nref]);
                     30:                else {
                     31:                        *t = 0;
                     32:                        if (keywant)
                     33:                                sprintf(t, "%s", fpar(nf,flds,t1,keywant,1,0));
                     34:                        if (science && t[0] == 0) {
                     35:                                sd = fpar(nf, flds, t2, 'D', 1, 0);
                     36:                                sprintf(t, "%s, %s", fpar(nf,flds,t1,'A',1,0),
                     37:                                        sd);
                     38:                        }
                     39:                        else if (t[0] == 0) {
                     40:                                sprintf(format,
                     41:                                        nmlen>0 ? "%%.%ds%%s" : "%%s%%s",
                     42:                                        nmlen);
                     43:                                /* format is %s%s for default labels */
                     44:                                /* or %.3s%s eg if wanted */
                     45:                                sd = fpar(nf, flds, t2, 'D', 1, 0);
                     46:                                if (dtlen > 0) {
                     47:                                        char *sdb;
                     48:                                        for (sdb = sd; *sd; sd++)
                     49:                                                ;
                     50:                                        sd = sd - dtlen;
                     51:                                        if (sd < sdb)
                     52:                                                sd = sdb;
                     53:                                }
                     54:                                sprintf(t, format, fpar(nf,flds,t1,'A',1,0),
                     55:                                        sd);
                     56:                        }
                     57:                        if (keywant) {
                     58:                                addon = 0;
                     59:                                for (sd = t; *sd; sd++)
                     60:                                        ;
                     61:                                if (*--sd == '-') {
                     62:                                        addon = 1;
                     63:                                        *sd = 0;
                     64:                                }
                     65:                        }
                     66:                        if ((!keywant || addon) && !science) {
                     67:                            addch(t, keylet(t, nref));
                     68:                        }
                     69:                        else {
                     70:                            tokeytab (t,nref);
                     71:                        }
                     72:                }
                     73:        }
                     74:        else {
                     75:                if (sort)
                     76:                        sprintf(t, "%c%d%c", FLAG, nref, FLAG);
                     77:                else
                     78:                        sprintf(t, "%d", nref);
                     79:        }
                     80:        another = prefix (".[", sd=lookat());
                     81:        if (another && (strcmp(".[\n", sd) != SAME))
                     82:                fprintf(stderr, "File %s line %d: punctuation ignored from: %s",
                     83:                        Ifile, Iline, sd);
                     84:        strcat(sig, t);
                     85: #if EBUG
                     86:        fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
                     87: #endif
                     88:        trimnl(nstline);
                     89:        trimnl(endline);
                     90:        stline = stbuff;
                     91:        if (prevsig == 0) {
                     92:                strcpy (stline, nstline);
                     93:                prevsig=1;
                     94:        }
                     95:        if (stline[2] || endline[2]) {
                     96:                stline += 2;
                     97:                endline += 2;
                     98:        }
                     99:        else {
                    100:                stline  = "\\*([.";
                    101:                endline = "\\*(.]";
                    102:        }
                    103:        if (science) {
                    104:                stline = " (";
                    105:                endline = ")";
                    106:        }
                    107:        if (bare == 0) {
                    108:                if (!another) {
                    109:                        sprintf(t1, "%s%s\%s\n", stline, sig, endline);
                    110:                        append(t1);
                    111:                        flout();
                    112:                        sig[0] = 0;
                    113:                        prevsig = 0;
                    114:                        if (fo == fhide) {
                    115:                                int ch;
                    116:                                fclose(fhide); 
                    117:                                fhide = fopen(hidenam, "r");
                    118:                                fo = ftemp;
                    119:                                while ((ch = getc(fhide)) != EOF)
                    120:                                        putc(ch, fo);
                    121:                                fclose(fhide);
                    122:                                unlink(hidenam);
                    123:                        }
                    124:                }
                    125:                else {
                    126:                        strcat(sig, ",\\|");
                    127:                        if (fo == ftemp) {      /* hide if need be */
                    128:                                sprintf(hidenam, "/tmp/rj%dc", getpid());
                    129: #if EBUG
                    130:                                fprintf(stderr, "hiding in %s\n", hidenam);
                    131: #endif
                    132:                                fhide = fopen(hidenam, "w");
                    133:                                if (fhide == NULL)
                    134:                                        err("Can't get scratch file %s",
                    135:                                                (void) hidenam);
                    136:                                fo = fhide;
                    137:                        }
                    138:                }
                    139:        }
                    140:        if (bare < 2)
                    141:                if (nf > 0)
                    142:                        fprintf(fo,".ds [F %s%c",t,sep);
                    143:        if (bare > 0)
                    144:                flout();
                    145: #if EBUG
                    146:        fprintf(stderr, "sig is now %s\n",sig);
                    147: #endif
                    148: }
                    149: 
                    150: char *
                    151: fpar (nf, flds, out, c, seq, prepend)
                    152: char *flds[], *out;
                    153: {
                    154:        char *p, *s;
                    155:        int i, fnd = 0;
                    156: 
                    157:        for(i = 0; i < nf; i++)
                    158:                if (flds[i][1] == c && ++fnd >= seq) {
                    159:                        /* for titles use first word otherwise last */
                    160:                        if (c == 'T' || c == 'J') {
                    161:                                p = flds[i]+3;
                    162:                                if (prefix("A ", p))
                    163:                                        p += 2;
                    164:                                if (prefix("An ", p))
                    165:                                        p += 3;
                    166:                                if (prefix("The ", p))
                    167:                                        p += 4;
                    168:                                mycpy2(out, p, 20);
                    169:                                return(out);
                    170:                        }
                    171:                        /* if its not 'L' then use just the last word */
                    172:                        s = p = flds[i]+2;
                    173:                        if (c != 'L') {
                    174:                            for(; *p; p++);
                    175:                            while (p > s && *p != ' ')
                    176:                                    p--;
                    177:                        }
                    178:                        /* special wart for authors */
                    179:                        if (c == 'A' && (p[-1] == ',' || p[1] =='(')) {
                    180:                                p--;
                    181:                                while (p > s && *p != ' ')
                    182:                                        p--;
                    183:                                mycpy(out, p+1);
                    184:                        }
                    185:                        else
                    186:                                strcpy(out, p+1);
                    187:                        if (c == 'A' && prepend)
                    188:                                initadd(out, flds[i]+2, p);
                    189:                        return(out);
                    190:                }
                    191:        return(0);
                    192: }
                    193: 
                    194: putkey(nf, flds, nref, keystr)
                    195: char *flds[], *keystr;
                    196: {
                    197:        char t1[50], *sf;
                    198:        int ctype, i, count;
                    199: 
                    200:        fprintf(fo, ".\\\"");
                    201:        if (nf <= 0)
                    202:                fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
                    203:        else {
                    204:                while (ctype = *keystr++) {
                    205:                        count = atoi(keystr);
                    206:                        if (*keystr=='+')
                    207:                                count=999;
                    208:                        if (count <= 0)
                    209:                                count = 1;
                    210:                        for(i = 1; i <= count; i++) {
                    211:                                sf = fpar(nf, flds, t1, ctype, i, 1);
                    212:                                if (sf == 0)
                    213:                                        break;
                    214:                                sf = artskp(sf);
                    215:                                fprintf(fo, "%s%c", sf, '-');
                    216:                        }
                    217:                }
                    218:                fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
                    219:        }
                    220: }
                    221: 
                    222: 
                    223: tokeytab (t, nref)
                    224: char *t;
                    225: {
                    226:        strcpy(labtab[nref]=lbp, t);
                    227:        while (*lbp++)
                    228:                ;
                    229: }
                    230: 
                    231: keylet(t, nref)
                    232: char *t;
                    233: {
                    234:        int i;
                    235:        int x = -1;
                    236: 
                    237:        for(i = 1; i < nref; i++) {
                    238:                if (strcmp(labtab[i], t) == 0)
                    239:                        x = labc[i];
                    240:        }
                    241:        tokeytab (t, nref);
                    242:        if (lbp-bflab > NFLAB)
                    243:                err("bflab overflow (%d)", NFLAB);
                    244:        if (nref > NLABC)
                    245:                err("nref in labc overflow (%d)", NLABC);
                    246: #if EBUG
                    247:        fprintf(stderr, "lbp up to %d of 2000\n", lbp-bflab);
                    248: #endif
                    249:        return(labc[nref] = x+1);
                    250: }
                    251: 
                    252: mycpy(s, t)
                    253: char *s, *t;
                    254: {
                    255:        while (*t && *t != ',' && *t != ' ')
                    256:                *s++ = *t++;
                    257:        *s = 0;
                    258: }
                    259: 
                    260: mycpy2(s, t, n)
                    261: char *s, *t;
                    262: {
                    263:        int c;
                    264: 
                    265:        while (n-- && (c= *t++) > 0) {
                    266:                if (c == ' ')
                    267:                        c = '-';
                    268:                *s++ = c;
                    269:        }
                    270:        *s = 0;
                    271: }
                    272: 
                    273: initadd(to, from, stop)
                    274: char *to, *from, *stop;
                    275: {
                    276:        int c, nalph = 1;
                    277: 
                    278:        while (*to)
                    279:                to++;
                    280:        while (from < stop) {
                    281:                c = *from++;
                    282:                if (!isalpha(c)) {
                    283:                        if (nalph)
                    284:                                *to++ = '.';
                    285:                        nalph = 0;
                    286:                        continue;
                    287:                }
                    288:                if (nalph++ == 0)
                    289:                        *to++ = c;
                    290:        }
                    291:        *to = 0;
                    292: }
                    293: 
                    294: static char *articles[] = {
                    295:        "the ", "an ", "a ", 0
                    296: };
                    297: 
                    298: char *
                    299: artskp(s)      /* skips over initial "a ", "an ", "the " in s */
                    300: char *s;
                    301: {
                    302: 
                    303:        char **p, *r1, *r2;
                    304: 
                    305:        for (p = articles; *p; p++) {
                    306:                r2 = s;
                    307:                for (r1 = *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
                    308:                        r2++;
                    309:                if (*r1 == 0 && *r2 != 0)
                    310:                        return(r2);
                    311:        }
                    312:        return(s);
                    313: }

unix.superglobalmegacorp.com

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