Annotation of 43BSD/usr.bin/refer/refer5.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *sccsid = "@(#)refer5.c    4.7 (Berkeley) 4/23/86";
        !             3: #endif
        !             4: 
        !             5: #include "refer..c"
        !             6: #define SAME 0
        !             7: #define NFLAB 3000             /* number of bytes to record all labels */
        !             8: #define NLABC 1000             /* max number of labels */
        !             9: 
        !            10: static char sig[MXSIG];
        !            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, toindex)   /* choose signal style */
        !            19: char *flds[], *nstline, *endline;
        !            20: {
        !            21:        char t[100], t1[MXSIG], 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:                sprintf(t, "%c%d%c", FLAG, nref, FLAG);
        !            76:        }
        !            77:        another = prefix (".[", sd=lookat());
        !            78:        if (another && (strcmp(".[\n", sd) != SAME))
        !            79:                fprintf(stderr, "File %s line %d: punctuation ignored from: %s",
        !            80:                        Ifile, Iline, sd);
        !            81:        if ((strlen(sig) + strlen(t)) > MXSIG)
        !            82:                err("sig overflow (%d)", MXSIG);
        !            83:        strcat(sig, t);
        !            84: #if EBUG
        !            85:        fprintf(stderr, "sig is now %s leng %d\n",sig,strlen(sig));
        !            86: #endif
        !            87:        trimnl(nstline);
        !            88:        trimnl(endline);
        !            89:        stline = stbuff;
        !            90:        if (prevsig == 0) {
        !            91:                strcpy (stline, nstline);
        !            92:                prevsig=1;
        !            93:        }
        !            94:        if (stline[2] || endline[2]) {
        !            95:                stline += 2;
        !            96:                endline += 2;
        !            97:        }
        !            98:        else {
        !            99:                stline  = "\\*([.";
        !           100:                endline = "\\*(.]";
        !           101:        }
        !           102:        if (science) {
        !           103:                stline = " (";
        !           104:                endline = ")";
        !           105:        }
        !           106:        if (bare == 0) {
        !           107:                if (!another) {
        !           108:                        sprintf(t1, "%s%s\%s\n", stline, sig, endline);
        !           109:                        if (strlen(t1) > MXSIG)
        !           110:                                err("t1 overflow (%d)", MXSIG);
        !           111:                        append(t1);
        !           112:                        flout();
        !           113:                        sig[0] = 0;
        !           114:                        prevsig = 0;
        !           115:                        if (fo == fhide) {
        !           116:                                int ch;
        !           117:                                fclose(fhide); 
        !           118:                                fhide = fopen(hidenam, "r");
        !           119:                                fo = ftemp;
        !           120:                                while ((ch = getc(fhide)) != EOF)
        !           121:                                        putc(ch, fo);
        !           122:                                fclose(fhide);
        !           123:                                unlink(hidenam);
        !           124:                        }
        !           125:                }
        !           126:                else {
        !           127:                        if (labels) {
        !           128:                                strcat(sig, ",\\|");
        !           129:                        } else {
        !           130:                                /*
        !           131:                                 * Seperate reference numbers with AFLAG
        !           132:                                 * for later sorting and condensing.
        !           133:                                 */
        !           134:                                t1[0] = AFLAG;
        !           135:                                t1[1] = '\0';
        !           136:                                strcat(sig, t1);
        !           137:                        }
        !           138:                        if (fo == ftemp) {      /* hide if need be */
        !           139:                                sprintf(hidenam, "/tmp/rj%dc", getpid());
        !           140: #if EBUG
        !           141:                                fprintf(stderr, "hiding in %s\n", hidenam);
        !           142: #endif
        !           143:                                fhide = fopen(hidenam, "w");
        !           144:                                if (fhide == NULL)
        !           145:                                        err("Can't get scratch file %s",
        !           146:                                                hidenam);
        !           147:                                fo = fhide;
        !           148:                        }
        !           149:                }
        !           150:        }
        !           151:        if (bare < 2)
        !           152:                if (nf > 0 && toindex)
        !           153:                        fprintf(fo,".ds [F %s%c",t,sep);
        !           154:        if (bare > 0)
        !           155:                flout();
        !           156: #if EBUG
        !           157:        fprintf(stderr, "sig is now %s\n",sig);
        !           158: #endif
        !           159: }
        !           160: 
        !           161: char *
        !           162: fpar (nf, flds, out, c, seq, prepend)
        !           163: char *flds[], *out;
        !           164: {
        !           165:        char *p, *s;
        !           166:        int i, fnd = 0;
        !           167: 
        !           168:        for(i = 0; i < nf; i++)
        !           169:                if (flds[i][1] == c && ++fnd >= seq) {
        !           170:                        /* for titles use first word otherwise last */
        !           171:                        if (c == 'T' || c == 'J') {
        !           172:                                p = flds[i]+3;
        !           173:                                if (prefix("A ", p))
        !           174:                                        p += 2;
        !           175:                                if (prefix("An ", p))
        !           176:                                        p += 3;
        !           177:                                if (prefix("The ", p))
        !           178:                                        p += 4;
        !           179:                                mycpy2(out, p, 20);
        !           180:                                return(out);
        !           181:                        }
        !           182:                        /* if its not 'L' then use just the last word */
        !           183:                        s = p = flds[i]+2;
        !           184:                        if (c != 'L') {
        !           185:                            for(; *p; p++);
        !           186:                            while (p > s && *p != ' ')
        !           187:                                    p--;
        !           188:                        }
        !           189:                        /* special wart for authors */
        !           190:                        if (c == 'A' && (p[-1] == ',' || p[1] =='(')) {
        !           191:                                p--;
        !           192:                                while (p > s && *p != ' ')
        !           193:                                        p--;
        !           194:                                mycpy(out, p+1);
        !           195:                        }
        !           196:                        else
        !           197:                                strcpy(out, p+1);
        !           198:                        if (c == 'A' && prepend)
        !           199:                                initadd(out, flds[i]+2, p);
        !           200:                        return(out);
        !           201:                }
        !           202:        return(0);
        !           203: }
        !           204: 
        !           205: putkey(nf, flds, nref, keystr)
        !           206: char *flds[], *keystr;
        !           207: {
        !           208:        char t1[50], *sf;
        !           209:        int ctype, i, count;
        !           210: 
        !           211:        fprintf(fo, ".\\\"");
        !           212:        if (nf <= 0)
        !           213:                fprintf(fo, "%s%c%c", labtab[nref], labc[nref], sep);
        !           214:        else {
        !           215:                while (ctype = *keystr++) {
        !           216:                        count = atoi(keystr);
        !           217:                        if (*keystr=='+')
        !           218:                                count=999;
        !           219:                        if (count <= 0)
        !           220:                                count = 1;
        !           221:                        for(i = 1; i <= count; i++) {
        !           222:                                sf = fpar(nf, flds, t1, ctype, i, 1);
        !           223:                                if (sf == 0)
        !           224:                                        break;
        !           225:                                sf = artskp(sf);
        !           226:                                fprintf(fo, "%s%c", sf, '-');
        !           227:                        }
        !           228:                }
        !           229:                fprintf(fo, "%c%d%c%c", FLAG, nref, FLAG, sep);
        !           230:        }
        !           231: }
        !           232: 
        !           233: 
        !           234: tokeytab (t, nref)
        !           235: char *t;
        !           236: {
        !           237:        strcpy(labtab[nref]=lbp, t);
        !           238:        while (*lbp++)
        !           239:                ;
        !           240: }
        !           241: 
        !           242: keylet(t, nref)
        !           243: char *t;
        !           244: {
        !           245:        int i;
        !           246:        int x = 'a' - 1;
        !           247: 
        !           248:        for(i = 1; i < nref; i++) {
        !           249:                if (strcmp(labtab[i], t) == 0)
        !           250:                        x = labc[i];
        !           251:        }
        !           252:        tokeytab (t, nref);
        !           253:        if (lbp-bflab > NFLAB)
        !           254:                err("bflab overflow (%d)", NFLAB);
        !           255:        if (nref > NLABC)
        !           256:                err("nref in labc overflow (%d)", NLABC);
        !           257: #if EBUG
        !           258:        fprintf(stderr, "lbp up to %d of %d\n", lbp-bflab, NFLAB);
        !           259: #endif
        !           260:        return(labc[nref] = x+1);
        !           261: }
        !           262: 
        !           263: mycpy(s, t)
        !           264: char *s, *t;
        !           265: {
        !           266:        while (*t && *t != ',' && *t != ' ')
        !           267:                *s++ = *t++;
        !           268:        *s = 0;
        !           269: }
        !           270: 
        !           271: mycpy2(s, t, n)
        !           272: char *s, *t;
        !           273: {
        !           274:        int c;
        !           275: 
        !           276:        while (n-- && (c= *t++) > 0) {
        !           277:                if (c == ' ')
        !           278:                        c = '-';
        !           279:                *s++ = c;
        !           280:        }
        !           281:        *s = 0;
        !           282: }
        !           283: 
        !           284: initadd(to, from, stop)
        !           285: char *to, *from, *stop;
        !           286: {
        !           287:        int c, nalph = 1;
        !           288: 
        !           289:        while (*to)
        !           290:                to++;
        !           291:        while (from < stop) {
        !           292:                c = *from++;
        !           293:                if (!isalpha(c)) {
        !           294:                        if (nalph)
        !           295:                                *to++ = '.';
        !           296:                        nalph = 0;
        !           297:                        continue;
        !           298:                }
        !           299:                if (nalph++ == 0)
        !           300:                        *to++ = c;
        !           301:        }
        !           302:        *to = 0;
        !           303: }
        !           304: 
        !           305: static char *articles[] = {
        !           306:        "the ", "an ", "a ", 0
        !           307: };
        !           308: 
        !           309: char *
        !           310: artskp(s)      /* skips over initial "a ", "an ", "the " in s */
        !           311: char *s;
        !           312: {
        !           313: 
        !           314:        char **p, *r1, *r2;
        !           315: 
        !           316:        for (p = articles; *p; p++) {
        !           317:                r2 = s;
        !           318:                for (r1 = *p; ((*r1 ^ *r2) & ~040 ) == 0; r1++)
        !           319:                        r2++;
        !           320:                if (*r1 == 0 && *r2 != 0)
        !           321:                        return(r2);
        !           322:        }
        !           323:        return(s);
        !           324: }

unix.superglobalmegacorp.com

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