📄 tk.c
字号:
/* * optimize output for Tek 4014 */#include <stdio.h>#include <signal.h>#define MAXY 3071#define LINE 47#define XOFF 248#define US 037#define GS 035#define ESC 033#define CR 015#define FF 014#define SO 016#define SI 017int pl = 66*LINE;int yyll = -1;char obuf[BUFSIZ];int xx = XOFF;int xoff = XOFF;int coff = 0;int ncol = 0;int maxcol = 1;int yy = MAXY;int ohy = -1;int ohx = -1;int oxb = -1;int oly = -1;int olx = -1;int alpha;int ry;FILE *ttyin;main(argc, argv)int argc;char **argv;{ register i, j; extern ex(); while (--argc > 0 && (++argv)[0][0]=='-') switch(argv[0][1]) { case 'p': if (i = atoi(&argv[0][2])) pl = i; yyll = MAXY + 1 - pl; break; default: if (i = atoi(&argv[0][1])) { maxcol = i; xx = xoff = 0; coff = 4096/i; } break; } if ((ttyin = fopen("/dev/tty", "r")) != NULL) setbuf(ttyin, (char *)NULL); if (argc) { if (freopen(argv[0], "r", stdin) == NULL) { fprintf(stderr, "tk: cannot open %s\n", argv[0]); exit(1); } } signal(SIGINT, ex); setbuf(stdout, obuf); ncol = maxcol; init(); while ((i = getchar()) != EOF) { switch(i) { case FF: yy = 0; case '\n': xx = xoff; yy -= LINE; alpha = 0; if (yy < yyll) { ncol++; yy = 0; sendpt(0); putchar(US); fflush(stdout); if (ncol >= maxcol) kwait(); init(); } continue; case CR: xx = xoff; alpha = 0; continue; case ' ': xx += 31; alpha = 0; continue; case '\t': /*tabstops at 8*31=248*/ j = ((xx-xoff)/248) + 1; xx += j*248 - (xx-xoff); alpha = 0; continue; case '\b': xx -= 31; alpha = 0; continue; case ESC: switch(i = getchar()) { case '7': yy += LINE; alpha = 0; continue; case '8': yy += (LINE + ry)/2; ry = (LINE + ry)%2; alpha = 0; continue; case '9': yy -= (LINE - ry)/2; ry = -(LINE - ry)%2; alpha = 0; continue; default: continue; } default: sendpt(alpha); if (alpha==0) { putchar(US); alpha = 1; } putchar(i); if (i>' ') xx += 31; continue; } } xx = xoff; yy = 0; sendpt(0); putchar(US); kwait(); ex();}init(){ ohx = oxb = olx = ohy = oly = -1; if (ncol >= maxcol) { ncol = 0; if (maxcol > 1) xoff = 0; else xoff = XOFF; } else xoff += coff; xx = xoff; yy = MAXY; if (ncol==0) fputs("\033\014\033;", stdout); sendpt(0);}ex(){ yy = MAXY; xx = 0; fputs("\033;\037", stdout); sendpt(1); exit(0);}kwait(){ register c; fflush(stdout); if (ttyin==NULL) return; while ((c=getc(ttyin))!='\n') { if (c=='!') { execom(); printf("!\n"); fflush(stdout); continue; } if (c==EOF) ex(); }}execom(){ int (*si)(), (*sq)(); if (fork() != 0) { si = signal(SIGINT, SIG_IGN); sq = signal(SIGQUIT, SIG_IGN); wait((int *)NULL); signal(SIGINT, si); signal(SIGQUIT, sq); return; } if (isatty(fileno(stdin)) == 0) { if (freopen("/dev/tty", "r", stdin)==NULL) freopen("/dev/null", "r", stdin); } execl("/bin/sh", "sh", "-t", 0);}sendpt(a){ register zz; int hy,xb,ly,hx,lx; if (a) return; if ((zz = yy) < 0) zz = 0; hy = ((zz>>7) & 037); xb = ((xx & 03) + ((zz<<2) & 014) & 017); ly = ((zz>>2) & 037); hx = ((xx>>7) & 037); lx = ((xx>>2) & 037); putchar(GS); if (hy != ohy) putchar(hy | 040); if (xb != oxb) putchar(xb | 0140); if ((ly != oly) || (hx != ohx) || (xb != oxb)) putchar(ly | 0140); if (hx != ohx) putchar(hx | 040); putchar(lx | 0100); ohy = hy; oxb = xb; oly = ly; ohx = hx; olx = lx; alpha = 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -