xref: /original-bsd/old/tk/tk.c (revision d25e1985)
1 static char *sccsid = "@(#)tk.c	4.1 (Berkeley) 10/01/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 }
250