V7/usr/src/cmd/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 017
int 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;
}