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: }
Defined functions
ex
defined in line
170; used 4 times
init
defined in line
152; used 2 times
main
defined in line
37;
never used
Defined variables
alpha
defined in line
33; used 12 times
coff
defined in line
24; used 2 times
ncol
defined in line
25; used 6 times
ohx
defined in line
29; used 4 times
ohy
defined in line
28; used 3 times
olx
defined in line
32; used 2 times
oly
defined in line
31; used 3 times
oxb
defined in line
30; used 4 times
pl
defined in line
20; used 2 times
ry
defined in line
34; used 6 times
sccsid
defined in line
1;
never used
xoff
defined in line
23; used 10 times
xx
defined in line
22; used 15 times
yy
defined in line
27; used 11 times
yyll
defined in line
21; used 2 times
Defined macros
CR
defined in line
15;
never used
ESC
defined in line
14;
never used
FF
defined in line
16;
never used
GS
defined in line
13; used 1 times
LINE
defined in line
10; used 7 times
MAXY
defined in line
9; used 4 times
SI
defined in line
18;
never used
SO
defined in line
17;
never used
US
defined in line
12; used 3 times
XOFF
defined in line
11; used 3 times