BSD 4 release
[unix-history] / usr / src / cmd / tk.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)tk.c 4.1 (Berkeley) 10/1/80";
9fb37411
BJ
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
20int pl = 66*LINE;
21int yyll = -1;
22char obuf[BUFSIZ];
23int xx = XOFF;
24int xoff = XOFF;
25int coff = 0;
26int ncol = 0;
27int maxcol = 1;
28int yy = MAXY;
29int ohy = -1;
30int ohx = -1;
31int oxb = -1;
32int oly = -1;
33int olx = -1;
34int alpha;
35int ry;
36FILE *ttyin;
37
38main(argc, argv)
39int argc;
40char **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
154init()
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
172ex()
173{
174 yy = MAXY;
175 xx = 0;
176 fputs("\033;\037", stdout);
177 sendpt(1);
178 exit(0);
179}
180
181kwait()
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
200execom()
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
219sendpt(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}