|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.