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

1.1       root        1: static char *sccsid = "@(#)tk.c        4.1 (Berkeley) 10/1/80";
                      2: /*
                      3:  * optimize output for Tek 4014
                      4:  */
                      5: 
                      6: #include <stdio.h>
                      7: #include <signal.h>
                      8: 
                      9: #define MAXY 3071
                     10: #define LINE 47
                     11: #define XOFF 248
                     12: #define US 037
                     13: #define GS 035
                     14: #define ESC 033
                     15: #define CR 015
                     16: #define FF 014
                     17: #define SO 016
                     18: #define SI 017
                     19: 
                     20: int    pl      = 66*LINE;
                     21: int    yyll    = -1;
                     22: char   obuf[BUFSIZ];
                     23: int    xx = XOFF;
                     24: int    xoff = XOFF;
                     25: int    coff = 0;
                     26: int    ncol = 0;
                     27: int    maxcol = 1;
                     28: int    yy = MAXY;
                     29: int    ohy = -1;
                     30: int    ohx = -1;
                     31: int    oxb = -1;
                     32: int    oly = -1;
                     33: int    olx = -1;
                     34: int    alpha;
                     35: int    ry;
                     36: FILE   *ttyin;
                     37: 
                     38: main(argc, argv)
                     39: int argc;
                     40: char **argv;
                     41: {
                     42:        register i, j;
                     43:        extern ex();
                     44: 
                     45:        while (--argc > 0 && (++argv)[0][0]=='-')
                     46:                switch(argv[0][1]) {
                     47:                        case 'p':
                     48:                                if (i = atoi(&argv[0][2]))
                     49:                                        pl = i;
                     50:                                        yyll = MAXY + 1 - pl;
                     51:                                break;
                     52:                        default:
                     53:                                if (i = atoi(&argv[0][1])) {
                     54:                                        maxcol = i;
                     55:                                        xx = xoff = 0;
                     56:                                        coff = 4096/i;
                     57:                                }
                     58:                                break;
                     59:                }
                     60:        if ((ttyin = fopen("/dev/tty", "r")) != NULL)
                     61:                setbuf(ttyin, (char *)NULL);
                     62:        if (argc) {
                     63:                if (freopen(argv[0], "r", stdin) == NULL) {
                     64:                        fprintf(stderr, "tk: cannot open %s\n", argv[0]);
                     65:                        exit(1);
                     66:                }
                     67:        }
                     68:        signal(SIGINT, ex);
                     69:        setbuf(stdout, obuf);
                     70:        ncol = maxcol;
                     71:        init();
                     72:        while ((i = getchar()) != EOF) {
                     73:                switch(i) {
                     74: 
                     75:                case FF:
                     76:                        yy = 0;
                     77:                case '\n':
                     78:                        xx = xoff;
                     79:                        yy -= LINE;
                     80:                        alpha = 0;
                     81:                        if (yy < yyll) {
                     82:                                ncol++;
                     83:                                yy = 0;
                     84:                                sendpt(0);
                     85:                                putchar(US);
                     86:                                fflush(stdout);
                     87:                                if (ncol >= maxcol)
                     88:                                        kwait();
                     89:                                init();
                     90:                        }
                     91:                        continue;
                     92: 
                     93:                case CR:
                     94:                        xx = xoff;
                     95:                        alpha = 0;
                     96:                        continue;
                     97: 
                     98:                case ' ':
                     99:                        xx += 31;
                    100:                        alpha = 0;
                    101:                        continue;
                    102: 
                    103:                case '\t': /*tabstops at 8*31=248*/
                    104:                        j = ((xx-xoff)/248) + 1;
                    105:                        xx += j*248 - (xx-xoff);
                    106:                        alpha = 0;
                    107:                        continue;
                    108: 
                    109:                case '\b':
                    110:                        xx -= 31;
                    111:                        alpha = 0;
                    112:                        continue;
                    113: 
                    114:                case ESC:
                    115:                        switch(i = getchar()) {
                    116:                        case '7':
                    117:                                yy += LINE;
                    118:                                alpha = 0;
                    119:                                continue;
                    120:                        case '8':
                    121:                                yy += (LINE + ry)/2;
                    122:                                ry = (LINE + ry)%2;
                    123:                                alpha = 0;
                    124:                                continue;
                    125:                        case '9':
                    126:                                yy -= (LINE - ry)/2;
                    127:                                ry = -(LINE - ry)%2;
                    128:                                alpha = 0;
                    129:                                continue;
                    130:                        default:
                    131:                                continue;
                    132:                        }
                    133: 
                    134:                default:
                    135:                        sendpt(alpha);
                    136:                        if (alpha==0) {
                    137:                                putchar(US);
                    138:                                alpha = 1;
                    139:                        }
                    140:                        putchar(i);
                    141:                        if (i>' ')
                    142:                                xx += 31;
                    143:                        continue;
                    144:                }
                    145:        }
                    146:        xx = xoff;
                    147:        yy = 0;
                    148:        sendpt(0);
                    149:        putchar(US);
                    150:        kwait();
                    151:        ex();
                    152: }
                    153: 
                    154: init()
                    155: {
                    156:        ohx = oxb = olx = ohy = oly = -1;
                    157:        if (ncol >= maxcol) {
                    158:                ncol = 0;
                    159:                if (maxcol > 1)
                    160:                        xoff = 0;
                    161:                else
                    162:                        xoff = XOFF;
                    163:        } else
                    164:                xoff += coff;
                    165:        xx = xoff;
                    166:        yy = MAXY;
                    167:        if (ncol==0)
                    168:                fputs("\033\014\033;", stdout);
                    169:        sendpt(0);
                    170: }
                    171: 
                    172: ex()
                    173: {
                    174:        yy = MAXY;
                    175:        xx = 0;
                    176:        fputs("\033;\037", stdout);
                    177:        sendpt(1);
                    178:        exit(0);
                    179: }
                    180: 
                    181: kwait()
                    182: {
                    183:        register c;
                    184: 
                    185:        fflush(stdout);
                    186:        if (ttyin==NULL)
                    187:                return;
                    188:        while ((c=getc(ttyin))!='\n') {
                    189:                if (c=='!') {
                    190:                        execom();
                    191:                        printf("!\n");
                    192:                        fflush(stdout);
                    193:                        continue;
                    194:                }
                    195:                if (c==EOF)
                    196:                        ex();
                    197:        }
                    198: }
                    199: 
                    200: execom()
                    201: {
                    202:        int (*si)(), (*sq)();
                    203: 
                    204:        if (fork() != 0) {
                    205:                si = signal(SIGINT, SIG_IGN);
                    206:                sq = signal(SIGQUIT, SIG_IGN);
                    207:                wait((int *)NULL);
                    208:                signal(SIGINT, si);
                    209:                signal(SIGQUIT, sq);
                    210:                return;
                    211:        }
                    212:        if (isatty(fileno(stdin)) == 0) {
                    213:                if (freopen("/dev/tty", "r", stdin)==NULL)
                    214:                        freopen("/dev/null", "r", stdin);
                    215:        }
                    216:        execl("/bin/sh", "sh", "-t", 0);
                    217: }
                    218: 
                    219: sendpt(a)
                    220: {
                    221:        register zz;
                    222:        int hy,xb,ly,hx,lx;
                    223: 
                    224:        if (a)
                    225:                return;
                    226:        if ((zz = yy) < 0)
                    227:                zz = 0;
                    228:        hy = ((zz>>7) & 037);
                    229:        xb = ((xx & 03) + ((zz<<2) & 014) & 017);
                    230:        ly = ((zz>>2) & 037);
                    231:        hx = ((xx>>7) & 037);
                    232:        lx = ((xx>>2) & 037);
                    233:        putchar(GS);
                    234:        if (hy != ohy)
                    235:                putchar(hy | 040);
                    236:        if (xb != oxb)
                    237:                putchar(xb | 0140);
                    238:        if ((ly != oly) || (hx != ohx) || (xb != oxb))
                    239:                putchar(ly | 0140);
                    240:        if (hx != ohx)
                    241:                putchar(hx | 040);
                    242:        putchar(lx | 0100);
                    243:        ohy = hy;
                    244:        oxb = xb;
                    245:        oly = ly;
                    246:        ohx = hx;
                    247:        olx = lx;
                    248:        alpha = 0;
                    249: }

unix.superglobalmegacorp.com

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