Annotation of 40BSD/cmd/ul.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)ul.c        4.1 (Berkeley) 10/1/80";
        !             2: /*
        !             3:  * ul
        !             4:  */
        !             5: #include <stdio.h>
        !             6: 
        !             7: char   buf[BUFSIZ];
        !             8: char   isul[BUFSIZ];
        !             9: char   termcap[1024];
        !            10: char   ulbuf[BUFSIZ];
        !            11: char   *stul, *endul, *chul;
        !            12: char   *backspace;
        !            13: char   *termtype;
        !            14: int    outc();
        !            15: char   *tgetstr();
        !            16: char   *getenv();
        !            17: 
        !            18: main(argc, argv)
        !            19:        int argc;
        !            20:        char **argv;
        !            21: {
        !            22:        register int i;
        !            23:        char *cp;
        !            24:        FILE *f;
        !            25: 
        !            26:        argc--, argv++;
        !            27:        termtype = getenv("TERM");
        !            28:        if (termtype == NULL)
        !            29:                termtype = "dumb";
        !            30:        while (argc > 0 && argv[0][0] == '-') {
        !            31:                switch(argv[0][1]) {
        !            32: 
        !            33:                case 't':
        !            34:                case 'T': /* for nroff compatibility */
        !            35:                        if (argv[0][2])
        !            36:                                termtype = &argv[0][2];
        !            37:                        else {
        !            38:                                termtype = argv[1];
        !            39:                                argc--;
        !            40:                                argv++;
        !            41:                        }
        !            42:                        break;
        !            43:                case 'i':
        !            44:                        argc--, argv++;
        !            45:                        iul(argc, argv);
        !            46:                        exit(0);
        !            47: 
        !            48:                default:
        !            49:                        printf("Usage: ul [ -i ] [ -tTerm ] file...\n");
        !            50:                        exit(1);
        !            51:                }
        !            52:        }
        !            53:        switch(tgetent(termcap, termtype)) {
        !            54: 
        !            55:        case 1:
        !            56:                if (tgetflag("os"))
        !            57:                        execv("/bin/cat",argv);
        !            58:                cp = ulbuf;
        !            59:                if ((backspace = tgetstr("bc",&cp)) == NULL)
        !            60:                        backspace = "\b";
        !            61:                /*
        !            62:                 * Handle terminals that have start underline/stop
        !            63:                 * underline sequences, as well as those with
        !            64:                 * underline char sequences (we assume the sequence
        !            65:                 * moves the cursor forward one character).
        !            66:                 * If we can't find underline sequences, we
        !            67:                 * settle for standout sequences.
        !            68:                 */
        !            69:                if ((chul=tgetstr("uc",&cp)) == NULL)
        !            70:                        chul = "";
        !            71:                if ((stul=tgetstr("us",&cp)) == NULL && !tgetflag("ul") &&
        !            72:                    (!*chul) && (stul=tgetstr("so",&cp)) == NULL)
        !            73:                        stul = "";
        !            74:                if ((endul=tgetstr("ue",&cp)) == NULL && !tgetflag("ul") &&
        !            75:                    (!*chul) && (endul=tgetstr("se",&cp)) == NULL)
        !            76:                        endul = "";
        !            77:                if (chul==0&&stul==0&&endul==0&&tgetflag("ul"))
        !            78:                        execv("/bin/cat",argv);
        !            79:                break;
        !            80: 
        !            81:        default:
        !            82:                fprintf(stderr,"trouble reading termcap");
        !            83:                /* fall through to ... */
        !            84: 
        !            85:        case 0:
        !            86:                /* No such terminal type - assume dumb */
        !            87:                stul = endul = chul = "";
        !            88:                break;
        !            89:        }
        !            90:        if (argc == 0)
        !            91:                filter(stdin);
        !            92:        else for (i=0; i<argc; i++) {
        !            93:                f = fopen(argv[i],"r");
        !            94:                if (f == NULL) {
        !            95:                        perror(argv[i]);
        !            96:                        exit(1);
        !            97:                } else
        !            98:                        filter(f);
        !            99:        }
        !           100:        exit(0);
        !           101: }
        !           102: 
        !           103: filter(f)
        !           104: FILE *f;
        !           105: {
        !           106:        register int p, n;
        !           107:        register char c;
        !           108:        int state;
        !           109: 
        !           110:        n = 0;
        !           111:        for (;;) {
        !           112:                p = 0;
        !           113:                for (p=0; p<n; p++) {
        !           114:                        buf[p] = '\0';
        !           115:                        isul[p] = 0;
        !           116:                }
        !           117:                p = n = 0;
        !           118: 
        !           119:                for (;;) {
        !           120:                        c = getc(f);
        !           121:                        if (c==EOF)
        !           122:                                break;
        !           123:                        if (c=='\b') {
        !           124:                                if (p > 0) {
        !           125:                                        p--;
        !           126:                                }
        !           127:                        } else if (c=='_' && isul[p]==0 && buf[p]) {
        !           128:                                isul[p] = 1;
        !           129:                                p++;
        !           130:                        } else {
        !           131:                                if (buf[p] == '_')
        !           132:                                        isul[p] = 1;
        !           133:                                buf[p] = c;
        !           134:                                p++;
        !           135:                                if (n < p)
        !           136:                                        n = p;
        !           137:                        }
        !           138:                        if (c=='\n')
        !           139:                                break;
        !           140:                }
        !           141: 
        !           142:                state = 0;
        !           143:                for (p=0; p<n; p++) {
        !           144:                        if (isul[p] != state)
        !           145:                                tputs(isul[p] ? stul : endul, 1, outc);
        !           146:                        state = isul[p];
        !           147:                        putchar(buf[p]);
        !           148:                        if (isul[p] && *chul) {
        !           149:                                printf("%s",backspace);
        !           150:                                tputs(chul, 1, outc);
        !           151:                        }
        !           152:                }
        !           153:                if (c==EOF) break;
        !           154:        }
        !           155: }
        !           156: 
        !           157: outc(c)
        !           158: char c;
        !           159: {
        !           160:        putchar(c);
        !           161: }
        !           162: 
        !           163: #define BACKSPACE 0
        !           164: #define        QUOTE   0200
        !           165: 
        !           166: char   linebuf[BUFSIZ], genbuf[BUFSIZ];
        !           167: char   *strcpy();
        !           168: 
        !           169: iul(argc, argv)
        !           170:        int argc;
        !           171:        char *argv[];
        !           172: {
        !           173:        register c;
        !           174:        register char *lp;
        !           175: 
        !           176:        do {
        !           177:                if (argc > 0) {
        !           178:                        if (freopen(argv[0], "r", stdin) == NULL) {
        !           179:                                perror(argv[0]);
        !           180:                                exit(1);
        !           181:                        }
        !           182:                        argc--; argv++;
        !           183:                }
        !           184:                while (fgets(linebuf, sizeof linebuf, stdin) != 0) {
        !           185:                        for (lp = linebuf; *lp; lp++)
        !           186:                                continue;
        !           187:                        *--lp = 0;
        !           188:                        doulg();
        !           189:                        dographic();
        !           190:                        if (genbuf[0])
        !           191:                                printf("\n%s", genbuf);
        !           192:                        putchar('\n');
        !           193:                        fflush(stdout);
        !           194:                }
        !           195:        } while (argc > 0);
        !           196:        exit(0);
        !           197: }
        !           198: 
        !           199: dographic()
        !           200: {
        !           201:        register char *lp;
        !           202:        register c;
        !           203: 
        !           204:        for (lp = linebuf; c = *lp++;) {
        !           205:                switch (c) {
        !           206:                        case '\b':
        !           207:                                if (BACKSPACE == 0)
        !           208:                                        c = '?';
        !           209:                                break;
        !           210:                        default:
        !           211:                                if (c < ' ' || c == 0177)
        !           212:                                        c = '?';
        !           213:                                break;
        !           214:                        case '\t':
        !           215:                                break;
        !           216:                }
        !           217:                putchar(c);
        !           218:        }
        !           219: }
        !           220: 
        !           221: doulg()
        !           222: {
        !           223:        register char *lp, *gp;
        !           224:        char *maxgp;
        !           225:        register c;
        !           226:        char csw;
        !           227:        int col;
        !           228: 
        !           229:        gp = genbuf;
        !           230:        *gp = 0;
        !           231:        maxgp = gp;
        !           232:        col = 0;
        !           233:        for (lp = linebuf; c = *lp++;) {
        !           234:                switch (c) {
        !           235:                        case '\t':
        !           236:                                while ((col & 7) != 7) {
        !           237:                                        *gp++ = ' ';
        !           238:                                        if (gp >= &genbuf[BUFSIZ - 2])
        !           239:                                                goto ovflo;
        !           240:                                        col++;
        !           241:                                }
        !           242:                                break;
        !           243:                        default:
        !           244:                                if (gp >= maxgp)
        !           245:                                        break;
        !           246:                                c |= (*gp & QUOTE);
        !           247:                                break;
        !           248:                        case '_':
        !           249:                                if (gp >= maxgp)
        !           250:                                        c = QUOTE;
        !           251:                                else
        !           252:                                        c = *gp | QUOTE;
        !           253:                                break;
        !           254:                        case '\b':
        !           255:                                if (gp > genbuf) {
        !           256:                                        gp--;
        !           257:                                        col--;
        !           258:                                }
        !           259:                                continue;
        !           260:                }
        !           261:                if (gp >= &genbuf[BUFSIZ - 2]) {
        !           262: ovflo:
        !           263:                        fprintf(stderr, "Line too long\n");
        !           264:                        exit(1);
        !           265:                }
        !           266:                *gp++ = c;
        !           267:                if (gp > maxgp)
        !           268:                        maxgp = gp;
        !           269:                col++;
        !           270:        }
        !           271:        *maxgp = 0;
        !           272:        strcpy(linebuf, genbuf);
        !           273:        for (lp = linebuf, gp = genbuf; c = *lp; gp++, lp++)
        !           274:                if (c & QUOTE) {
        !           275:                        c &= 0177;
        !           276:                        if (c == 0)
        !           277:                                *lp = '_', *gp = ' ';
        !           278:                        else
        !           279:                                *lp = c, *gp = '-';
        !           280:                } else
        !           281:                        *gp = ' ';
        !           282:        --gp;
        !           283:        while (gp >= genbuf && *gp == ' ')
        !           284:                --gp;
        !           285:        gp[1] = 0;
        !           286: }

unix.superglobalmegacorp.com

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