Annotation of researchv10no/cmd/4014.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * optimize output for Tek 4014
                      3:  */
                      4: 
                      5: char x4014vers[] = "@(#)4014.c 1.5";
                      6: 
                      7: #include <stdio.h>
                      8: #include <signal.h>
                      9: #include <sgtty.h>
                     10: 
                     11: #define MAXY 3071
                     12: #define LINE 47
                     13: #define INCH 282
                     14: #define XOFF 248
                     15: #define US 037
                     16: #define GS 035
                     17: #define ESC 033
                     18: #define CR 015
                     19: #define FF 014
                     20: #define SO 016
                     21: #define SI 017
                     22: #define VALID  01777
                     23: #define HALF   5
                     24: #define HALFMASK       037
                     25: 
                     26: int    pl      = 66*LINE;
                     27: int    yyll    = -1;
                     28: char   obuf[BUFSIZ];
                     29: int    xx = XOFF;
                     30: int    xoff = XOFF;
                     31: int    coff = 0;
                     32: int    ncol = 0;
                     33: int    maxcol = 1;
                     34: int    yy = MAXY;
                     35: int    ohy = -1;
                     36: int    ohx = -1;
                     37: int    oxb = -1;
                     38: int    oly = -1;
                     39: int    olx = -1;
                     40: int    alpha;
                     41: int    ry;
                     42: int    erase = 1;
                     43: int    tflg;
                     44: FILE   *ttyin;
                     45: 
                     46: main(argc, argv)
                     47: int argc;
                     48: char **argv;
                     49: {
                     50:        register i, j;
                     51:        register c;
                     52:        char *argptr;
                     53:        extern ex();
                     54:        extern char *optarg;
                     55:        extern int optind;
                     56: 
                     57:        while ((c = getopt(argc, argv, "tnp:c:")) != EOF)
                     58:                switch(c) {
                     59:                        case 'p':
                     60:                                argptr = optarg;
                     61:                                if (i = tekpoints(argptr)) {
                     62:                                        pl = i;
                     63:                                        yyll = MAXY + 1 - pl;
                     64:                                }
                     65:                                break;
                     66:                        case 'n':
                     67:                                erase = 0;
                     68:                                break;
                     69: 
                     70:                        case 't':
                     71:                                tflg ++;
                     72:                                break;
                     73: 
                     74:                        case 'c':
                     75:                                argptr = optarg;
                     76:                                if (i = atoi(argptr)) {
                     77:                                        maxcol = i;
                     78:                                        xx = xoff = 0;
                     79:                                        coff = 4096/i;
                     80:                                }
                     81:                                break;
                     82: 
                     83:                        case '?':
                     84:                                fprintf(stderr, "usage: 4014 [ -tn ] [ -cN ] [ -pL ] [ file ]\n",(char *)NULL);
                     85:                                exit(1);
                     86:                }
                     87:        if ((ttyin = fopen("/dev/tty", "r")) != NULL)
                     88:                setbuf(ttyin, (char *)NULL);
                     89:        if ( optind < argc ) {
                     90:                if (freopen(argv[optind], "r", stdin) == NULL) {
                     91:                        fprintf(stderr, "4014: cannot open %s\n", argv[optind]);
                     92:                        exit(1);
                     93:                }
                     94:        }
                     95:        signal(SIGINT, ex);
                     96:        setbuf(stdout, obuf);
                     97:        ncol = maxcol;
                     98:        init();
                     99:        while ((i = getchar()) != EOF) {
                    100:                switch(i) {
                    101: 
                    102:                case FF:
                    103:                        yy = 0;
                    104:                case '\n':
                    105:                        xx = xoff;
                    106:                        yy -= LINE;
                    107:                        alpha = 0;
                    108:                        if (yy < yyll) {
                    109:                                ncol++;
                    110:                                yy = 0;
                    111:                                sendpt(0);
                    112:                                putchar(US);
                    113:                                fflush(stdout);
                    114:                                if (ncol >= maxcol)
                    115:                                        kwait();
                    116:                                init();
                    117:                        }
                    118:                        continue;
                    119: 
                    120:                case CR:
                    121:                        xx = xoff;
                    122:                        alpha = 0;
                    123:                        continue;
                    124: 
                    125:                case ' ':
                    126:                        xx += 31;
                    127:                        alpha = 0;
                    128:                        continue;
                    129: 
                    130:                case '\t': /*tabstops at 8*31=248*/
                    131:                        j = ((xx-xoff)/248) + 1;
                    132:                        xx += j*248 - (xx-xoff);
                    133:                        alpha = 0;
                    134:                        continue;
                    135: 
                    136:                case '\b':
                    137:                        xx -= 31;
                    138:                        alpha = 0;
                    139:                        continue;
                    140: 
                    141:                case ESC:
                    142:                        switch(i = getchar()) {
                    143:                        case '7':
                    144:                                yy += LINE;
                    145:                                alpha = 0;
                    146:                                continue;
                    147:                        case '8':
                    148:                                yy += (LINE + ry)/2;
                    149:                                ry = (LINE + ry)%2;
                    150:                                alpha = 0;
                    151:                                continue;
                    152:                        case '9':
                    153:                                yy -= (LINE - ry)/2;
                    154:                                ry = -(LINE - ry)%2;
                    155:                                alpha = 0;
                    156:                                continue;
                    157:                        default:
                    158:                                continue;
                    159:                        }
                    160: 
                    161:                default:
                    162:                        sendpt(alpha);
                    163:                        if (alpha==0) {
                    164:                                putchar(US);
                    165:                                alpha = 1;
                    166:                        }
                    167:                        putchar(i);
                    168:                        if (i>' ')
                    169:                                xx += 31;
                    170:                        continue;
                    171:                }
                    172:        }
                    173:        xx = xoff;
                    174:        yy = 0;
                    175:        sendpt(0);
                    176:        putchar(US);
                    177:        kwait();
                    178:        ex();
                    179: }
                    180: 
                    181: init()
                    182: {
                    183:        static flags;
                    184:        ohx = oxb = olx = ohy = oly = -1;
                    185:        if (ncol >= maxcol) {
                    186:                ncol = 0;
                    187:                if (maxcol > 1)
                    188:                        xoff = 0;
                    189:                else
                    190:                        xoff = XOFF;
                    191:        } else
                    192:                xoff += coff;
                    193:        xx = xoff;
                    194:        yy = MAXY;
                    195:        if (ncol==0 && erase)
                    196:                fputs("\033\014\033;", stdout);
                    197:        sendpt(!erase);
                    198:        if(!erase && !flags && isatty(fileno(stdout))) {
                    199:                struct sgttyb statb;
                    200: 
                    201:                gtty(fileno(ttyin), &statb);
                    202:                flags = statb.sg_flags;
                    203:                statb.sg_flags = (flags & ~ECHO) | CBREAK;
                    204:                stty(fileno(ttyin), &statb);
                    205:                fputs("\033\005", stdout);
                    206:                fflush(stdout);
                    207:                getc(ttyin);
                    208:                xx = (getc(ttyin) << HALF) & VALID;
                    209:                xx |= getc(ttyin) & HALFMASK;
                    210:                yy = (getc(ttyin) << HALF) & VALID;
                    211:                yy |= getc(ttyin) & HALFMASK;
                    212:                xx <<= 2, yy <<= 2;
                    213:                statb.sg_flags = flags;
                    214:                stty(fileno(ttyin), &statb);
                    215:        }
                    216: }
                    217: 
                    218: ex()
                    219: {
                    220:        yy = MAXY;
                    221:        xx = 0;
                    222:        fputs("\033;\037", stdout);
                    223:        sendpt(1);
                    224:        exit(0);
                    225: }
                    226: 
                    227: kwait()
                    228: {
                    229:        register c;
                    230: 
                    231:        fflush(stdout);
                    232:        if (ttyin==NULL || tflg )
                    233:                return;
                    234:        while ((c=getc(ttyin))!='\n') {
                    235:                if (c=='!') {
                    236:                        execom();
                    237:                        printf("!\n");
                    238:                        fflush(stdout);
                    239:                        continue;
                    240:                }
                    241:                if (c==EOF)
                    242:                        ex();
                    243:        }
                    244: }
                    245: 
                    246: execom()
                    247: {
                    248:        int (*si)(), (*sq)();
                    249: 
                    250:        if (fork() != 0) {
                    251:                si = signal(SIGINT, SIG_IGN);
                    252:                sq = signal(SIGQUIT, SIG_IGN);
                    253:                wait((int *)NULL);
                    254:                signal(SIGINT, si);
                    255:                signal(SIGQUIT, sq);
                    256:                return;
                    257:        }
                    258:        if (isatty(fileno(stdin)) == 0) {
                    259:                if (freopen("/dev/tty", "r", stdin)==NULL)
                    260:                        freopen("/dev/null", "r", stdin);
                    261:        }
                    262:        execl("/bin/sh", "sh", "-t", 0);
                    263: }
                    264: 
                    265: sendpt(a)
                    266: {
                    267:        register zz;
                    268:        int hy,xb,ly,hx,lx;
                    269: 
                    270:        if (a)
                    271:                return;
                    272:        if ((zz = yy) < 0)
                    273:                zz = 0;
                    274:        hy = ((zz>>7) & 037);
                    275:        xb = ((xx & 03) + ((zz<<2) & 014) & 017);
                    276:        ly = ((zz>>2) & 037);
                    277:        hx = ((xx>>7) & 037);
                    278:        lx = ((xx>>2) & 037);
                    279:        putchar(GS);
                    280:        if (hy != ohy)
                    281:                putchar(hy | 040);
                    282:        if (xb != oxb)
                    283:                putchar(xb | 0140);
                    284:        if ((ly != oly) || (hx != ohx) || (xb != oxb))
                    285:                putchar(ly | 0140);
                    286:        if (hx != ohx)
                    287:                putchar(hx | 040);
                    288:        putchar(lx | 0100);
                    289:        ohy = hy;
                    290:        oxb = xb;
                    291:        oly = ly;
                    292:        ohx = hx;
                    293:        olx = lx;
                    294:        alpha = 0;
                    295: }
                    296: tekpoints(str)
                    297: register char *str;
                    298: {
                    299:        register c,s = 0;
                    300:        while((c = *str++) && ( c >= '0' && c <= '9'))
                    301:                s = 10 * s + c - '0';
                    302:        switch(c) {
                    303:        case 'l':
                    304:        case '\0':
                    305:                return(s * LINE);
                    306:        case 'i':
                    307:                return(s*INCH);
                    308:        default:
                    309:                fprintf(stderr,"illegal scale factor: %s\n", str-1);
                    310:                exit(1);
                    311:        }
                    312: }

unix.superglobalmegacorp.com

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