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