Annotation of 43BSDTahoe/usr.bin/tk.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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