|
|
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.