xref: /original-bsd/old/tk/tk.c (revision f3cd0a77)
1 static char *sccsid = "@(#)tk.c	4.3 (Berkeley) 05/11/89";
2 /*
3  * optimize output for Tek 4014
4  */
5 
6 #include <sys/signal.h>
7 #include <stdio.h>
8 #include <paths.h>
9 
10 #define MAXY 3071
11 #define LINE 47
12 #define XOFF 248
13 #define US 037
14 #define GS 035
15 #define ESC 033
16 #define CR 015
17 #define FF 014
18 #define SO 016
19 #define SI 017
20 
21 int	pl	= 66*LINE;
22 int	yyll	= -1;
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(_PATH_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 	ncol = maxcol;
70 	init();
71 	while ((i = getchar()) != EOF) {
72 		switch(i) {
73 
74 		case FF:
75 			yy = 0;
76 		case '\n':
77 			xx = xoff;
78 			yy -= LINE;
79 			alpha = 0;
80 			if (yy < yyll) {
81 				ncol++;
82 				yy = 0;
83 				sendpt(0);
84 				putchar(US);
85 				fflush(stdout);
86 				if (ncol >= maxcol)
87 					kwait();
88 				init();
89 			}
90 			continue;
91 
92 		case CR:
93 			xx = xoff;
94 			alpha = 0;
95 			continue;
96 
97 		case ' ':
98 			xx += 31;
99 			alpha = 0;
100 			continue;
101 
102 		case '\t': /*tabstops at 8*31=248*/
103 			j = ((xx-xoff)/248) + 1;
104 			xx += j*248 - (xx-xoff);
105 			alpha = 0;
106 			continue;
107 
108 		case '\b':
109 			xx -= 31;
110 			alpha = 0;
111 			continue;
112 
113 		case ESC:
114 			switch(i = getchar()) {
115 			case '7':
116 				yy += LINE;
117 				alpha = 0;
118 				continue;
119 			case '8':
120 				yy += (LINE + ry)/2;
121 				ry = (LINE + ry)%2;
122 				alpha = 0;
123 				continue;
124 			case '9':
125 				yy -= (LINE - ry)/2;
126 				ry = -(LINE - ry)%2;
127 				alpha = 0;
128 				continue;
129 			default:
130 				continue;
131 			}
132 
133 		default:
134 			sendpt(alpha);
135 			if (alpha==0) {
136 				putchar(US);
137 				alpha = 1;
138 			}
139 			putchar(i);
140 			if (i>' ')
141 				xx += 31;
142 			continue;
143 		}
144 	}
145 	xx = xoff;
146 	yy = 0;
147 	sendpt(0);
148 	putchar(US);
149 	kwait();
150 	ex();
151 }
152 
153 init()
154 {
155 	ohx = oxb = olx = ohy = oly = -1;
156 	if (ncol >= maxcol) {
157 		ncol = 0;
158 		if (maxcol > 1)
159 			xoff = 0;
160 		else
161 			xoff = XOFF;
162 	} else
163 		xoff += coff;
164 	xx = xoff;
165 	yy = MAXY;
166 	if (ncol==0)
167 		fputs("\033\014\033;", stdout);
168 	sendpt(0);
169 }
170 
171 ex()
172 {
173 	yy = MAXY;
174 	xx = 0;
175 	fputs("\033;\037", stdout);
176 	sendpt(1);
177 	exit(0);
178 }
179 
180 kwait()
181 {
182 	register c;
183 
184 	fflush(stdout);
185 	if (ttyin==NULL)
186 		return;
187 	while ((c=getc(ttyin))!='\n') {
188 		if (c=='!') {
189 			execom();
190 			printf("!\n");
191 			fflush(stdout);
192 			continue;
193 		}
194 		if (c==EOF)
195 			ex();
196 	}
197 }
198 
199 execom()
200 {
201 	int (*si)(), (*sq)();
202 
203 	if (fork() != 0) {
204 		si = signal(SIGINT, SIG_IGN);
205 		sq = signal(SIGQUIT, SIG_IGN);
206 		wait((int *)NULL);
207 		signal(SIGINT, si);
208 		signal(SIGQUIT, sq);
209 		return;
210 	}
211 	if (isatty(fileno(stdin)) == 0) {
212 		if (freopen(_PATH_TTY, "r", stdin)==NULL)
213 			freopen(_PATH_DEVNULL, "r", stdin);
214 	}
215 	execl(_PATH_BSHELL, "sh", "-t", 0);
216 }
217 
218 sendpt(a)
219 {
220 	register zz;
221 	int hy,xb,ly,hx,lx;
222 
223 	if (a)
224 		return;
225 	if ((zz = yy) < 0)
226 		zz = 0;
227 	hy = ((zz>>7) & 037);
228 	xb = ((xx & 03) + ((zz<<2) & 014) & 017);
229 	ly = ((zz>>2) & 037);
230 	hx = ((xx>>7) & 037);
231 	lx = ((xx>>2) & 037);
232 	putchar(GS);
233 	if (hy != ohy)
234 		putchar(hy | 040);
235 	if (xb != oxb)
236 		putchar(xb | 0140);
237 	if ((ly != oly) || (hx != ohx) || (xb != oxb))
238 		putchar(ly | 0140);
239 	if (hx != ohx)
240 		putchar(hx | 040);
241 	putchar(lx | 0100);
242 	ohy = hy;
243 	oxb = xb;
244 	oly = ly;
245 	ohx = hx;
246 	olx = lx;
247 	alpha = 0;
248 }
249