xref: /original-bsd/old/tk/tk.c (revision e78e7ec3)
1 static char *sccsid = "@(#)tk.c	4.2 (Berkeley) 05/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 }
248