xref: /csrg-svn/usr.bin/window/ttzapple.c (revision 62467)
137455Sedward /*
2*62467Sbostic  * Copyright (c) 1989, 1993
3*62467Sbostic  *	The Regents of the University of California.  All rights reserved.
437455Sedward  *
542954Sbostic  * This code is derived from software contributed to Berkeley by
642954Sbostic  * Edward Wang at The University of California, Berkeley.
742954Sbostic  *
842835Sbostic  * %sccs.include.redist.c%
937455Sedward  */
1037455Sedward 
1137455Sedward #ifndef lint
12*62467Sbostic static char sccsid[] = "@(#)ttzapple.c	8.1 (Berkeley) 06/06/93";
1337455Sedward #endif /* not lint */
1437455Sedward 
1537455Sedward #include "ww.h"
1637455Sedward #include "tt.h"
1737455Sedward #include "char.h"
1837455Sedward 
1937455Sedward /*
2038796Sedward zz|zapple|perfect apple:\
2137455Sedward 	:am:pt:co#80:li#24:le=^H:nd=^F:up=^K:do=^J:\
2238796Sedward 	:ho=\E0:ll=\E1:cm=\E=%+ %+ :ch=\E<%+ :cv=\E>%+ :\
2338796Sedward 	:cl=\E4:ce=\E2:cd=\E3:rp=\E@%.%+ :\
2438796Sedward 	:so=\E+:se=\E-:\
2538796Sedward 	:dc=\Ec:DC=\EC%+ :ic=\Ei:IC=\EI%+ :\
2638796Sedward 	:al=\Ea:AL=\EA%+ :dl=\Ed:DL=\ED%+ :\
2738796Sedward 	:sf=\Ef:SF=\EF%+ :sr=\Er:SR=\ER%+ :cs=\E?%+ %+ :\
2838796Sedward 	:is=\E-\ET :
2937455Sedward */
3037455Sedward 
3138563Sedward #define NCOL		80
3238563Sedward #define NROW		24
3338563Sedward #define TOKEN_MAX	32
3437455Sedward 
3537455Sedward extern short gen_frame[];
3637455Sedward 
3754374Sedward 	/* for error correction */
3854374Sedward int zz_ecc;
3956710Sedward int zz_lastc;
4054374Sedward 
4156710Sedward 	/* for checkpointing */
4256710Sedward int zz_sum;
4356710Sedward 
zz_setmodes(new)4437455Sedward zz_setmodes(new)
4537455Sedward {
4637455Sedward 	if (new & WWM_REV) {
4738796Sedward 		if ((tt.tt_modes & WWM_REV) == 0)
4838797Sedward 			ttesc('+');
4937455Sedward 	} else
5038796Sedward 		if (tt.tt_modes & WWM_REV)
5138797Sedward 			ttesc('-');
5237455Sedward 	tt.tt_modes = new;
5337455Sedward }
5437455Sedward 
zz_insline(n)5537998Sedward zz_insline(n)
5637455Sedward {
5738796Sedward 	if (n == 1)
5838797Sedward 		ttesc('a');
5938796Sedward 	else {
6038797Sedward 		ttesc('A');
6138797Sedward 		ttputc(n + ' ');
6237998Sedward 	}
6337455Sedward }
6437455Sedward 
zz_delline(n)6537998Sedward zz_delline(n)
6637455Sedward {
6738796Sedward 	if (n == 1)
6838797Sedward 		ttesc('d');
6938796Sedward 	else {
7038797Sedward 		ttesc('D');
7138797Sedward 		ttputc(n + ' ');
7237998Sedward 	}
7337455Sedward }
7437455Sedward 
zz_putc(c)7537455Sedward zz_putc(c)
7637455Sedward 	char c;
7737455Sedward {
7837455Sedward 	if (tt.tt_nmodes != tt.tt_modes)
7937455Sedward 		zz_setmodes(tt.tt_nmodes);
8037998Sedward 	ttputc(c);
8137455Sedward 	if (++tt.tt_col == NCOL)
8237455Sedward 		tt.tt_col = 0, tt.tt_row++;
8337455Sedward }
8437455Sedward 
zz_write(p,n)8537455Sedward zz_write(p, n)
8637455Sedward 	register char *p;
8737455Sedward 	register n;
8837455Sedward {
8937455Sedward 	if (tt.tt_nmodes != tt.tt_modes)
9037455Sedward 		zz_setmodes(tt.tt_nmodes);
9138563Sedward 	ttwrite(p, n);
9237455Sedward 	tt.tt_col += n;
9337455Sedward 	if (tt.tt_col == NCOL)
9437455Sedward 		tt.tt_col = 0, tt.tt_row++;
9537455Sedward }
9637455Sedward 
zz_move(row,col)9737455Sedward zz_move(row, col)
9837455Sedward 	register row, col;
9937455Sedward {
10038563Sedward 	register x;
10138563Sedward 
10237455Sedward 	if (tt.tt_row == row) {
10339159Sedward same_row:
10438563Sedward 		if ((x = col - tt.tt_col) == 0)
10537455Sedward 			return;
10637455Sedward 		if (col == 0) {
10738797Sedward 			ttctrl('m');
10837455Sedward 			goto out;
10937455Sedward 		}
11038563Sedward 		switch (x) {
11138563Sedward 		case 2:
11238797Sedward 			ttctrl('f');
11338563Sedward 		case 1:
11438797Sedward 			ttctrl('f');
11537455Sedward 			goto out;
11638563Sedward 		case -2:
11738797Sedward 			ttctrl('h');
11838563Sedward 		case -1:
11938797Sedward 			ttctrl('h');
12037455Sedward 			goto out;
12137455Sedward 		}
12242861Sedward 		if ((col & 7) == 0 && x > 0 && x <= 16) {
12338797Sedward 			ttctrl('i');
12438563Sedward 			if (x > 8)
12538797Sedward 				ttctrl('i');
12638563Sedward 			goto out;
12738563Sedward 		}
12838797Sedward 		ttesc('<');
12938797Sedward 		ttputc(col + ' ');
13037455Sedward 		goto out;
13137455Sedward 	}
13237455Sedward 	if (tt.tt_col == col) {
13338563Sedward 		switch (row - tt.tt_row) {
13438563Sedward 		case 2:
13538797Sedward 			ttctrl('j');
13638563Sedward 		case 1:
13738797Sedward 			ttctrl('j');
13838563Sedward 			goto out;
13938563Sedward 		case -2:
14038797Sedward 			ttctrl('k');
14138563Sedward 		case -1:
14238797Sedward 			ttctrl('k');
14337455Sedward 			goto out;
14437455Sedward 		}
14537455Sedward 		if (col == 0) {
14637455Sedward 			if (row == 0)
14737455Sedward 				goto home;
14837455Sedward 			if (row == NROW - 1)
14937455Sedward 				goto ll;
15037455Sedward 		}
15138797Sedward 		ttesc('>');
15238797Sedward 		ttputc(row + ' ');
15337455Sedward 		goto out;
15437455Sedward 	}
15537455Sedward 	if (col == 0) {
15637455Sedward 		if (row == 0) {
15737455Sedward home:
15838797Sedward 			ttesc('0');
15937455Sedward 			goto out;
16037455Sedward 		}
16138563Sedward 		if (row == tt.tt_row + 1) {
16239159Sedward 			/*
16339159Sedward 			 * Do newline first to match the sequence
16439159Sedward 			 * for scroll down and return
16539159Sedward 			 */
16639159Sedward 			ttctrl('j');
16738797Sedward 			ttctrl('m');
16838563Sedward 			goto out;
16938563Sedward 		}
17037455Sedward 		if (row == NROW - 1) {
17137455Sedward ll:
17238797Sedward 			ttesc('1');
17337455Sedward 			goto out;
17437455Sedward 		}
17537455Sedward 	}
17639159Sedward 	/* favor local motion for better compression */
17739159Sedward 	if (row == tt.tt_row + 1) {
17839159Sedward 		ttctrl('j');
17939159Sedward 		goto same_row;
18039159Sedward 	}
18139159Sedward 	if (row == tt.tt_row - 1) {
18239159Sedward 		ttctrl('k');
18339159Sedward 		goto same_row;
18439159Sedward 	}
18538797Sedward 	ttesc('=');
18638797Sedward 	ttputc(' ' + row);
18738797Sedward 	ttputc(' ' + col);
18837455Sedward out:
18937455Sedward 	tt.tt_col = col;
19037455Sedward 	tt.tt_row = row;
19137455Sedward }
19237455Sedward 
zz_start()19338563Sedward zz_start()
19437455Sedward {
19538797Sedward 	ttesc('T');
19638797Sedward 	ttputc(TOKEN_MAX + ' ');
19754374Sedward 	ttesc('U');
19854374Sedward 	ttputc('!');
19954374Sedward 	zz_ecc = 1;
20056710Sedward 	zz_lastc = -1;
20156710Sedward 	ttesc('v');
20256710Sedward 	ttflush();
20356710Sedward 	zz_sum = 0;
20456710Sedward 	zz_setscroll(0, NROW - 1);
20556710Sedward 	zz_clear();
20656710Sedward 	zz_setmodes(0);
20737455Sedward }
20837455Sedward 
zz_reset()20956710Sedward zz_reset()
21056710Sedward {
21156710Sedward 	zz_setscroll(0, NROW - 1);
21256710Sedward 	tt.tt_modes = WWM_REV;
21356710Sedward 	zz_setmodes(0);
21456710Sedward 	tt.tt_col = tt.tt_row = -10;
21556710Sedward }
21656710Sedward 
zz_end()21737455Sedward zz_end()
21837455Sedward {
21938797Sedward 	ttesc('T');
22038797Sedward 	ttputc(' ');
22154374Sedward 	ttesc('U');
22254374Sedward 	ttputc(' ');
22354374Sedward 	zz_ecc = 0;
22437455Sedward }
22537455Sedward 
zz_clreol()22637455Sedward zz_clreol()
22737455Sedward {
22838797Sedward 	ttesc('2');
22937455Sedward }
23037455Sedward 
zz_clreos()23137455Sedward zz_clreos()
23237455Sedward {
23338797Sedward 	ttesc('3');
23437455Sedward }
23537455Sedward 
zz_clear()23637455Sedward zz_clear()
23737455Sedward {
23838797Sedward 	ttesc('4');
23937455Sedward 	tt.tt_col = tt.tt_row = 0;
24037455Sedward }
24137455Sedward 
zz_insspace(n)24238748Sedward zz_insspace(n)
24337455Sedward {
24438796Sedward 	if (n == 1)
24538797Sedward 		ttesc('i');
24638796Sedward 	else {
24738797Sedward 		ttesc('I');
24838797Sedward 		ttputc(n + ' ');
24937998Sedward 	}
25037455Sedward }
25137455Sedward 
zz_delchar(n)25237998Sedward zz_delchar(n)
25337455Sedward {
25438796Sedward 	if (n == 1)
25538797Sedward 		ttesc('c');
25638796Sedward 	else {
25738797Sedward 		ttesc('C');
25838797Sedward 		ttputc(n + ' ');
25937998Sedward 	}
26037998Sedward }
26137998Sedward 
zz_scroll_down(n)26237998Sedward zz_scroll_down(n)
26337998Sedward {
26438796Sedward 	if (n == 1)
26538796Sedward 		if (tt.tt_row == NROW - 1)
26638797Sedward 			ttctrl('j');
26738796Sedward 		else
26838797Sedward 			ttesc('f');
26938796Sedward 	else {
27038797Sedward 		ttesc('F');
27138797Sedward 		ttputc(n + ' ');
27237455Sedward 	}
27337455Sedward }
27437455Sedward 
zz_scroll_up(n)27537998Sedward zz_scroll_up(n)
27637455Sedward {
27738796Sedward 	if (n == 1)
27838797Sedward 		ttesc('r');
27938796Sedward 	else {
28038797Sedward 		ttesc('R');
28138797Sedward 		ttputc(n + ' ');
28237998Sedward 	}
28337455Sedward }
28437455Sedward 
zz_setscroll(top,bot)28537455Sedward zz_setscroll(top, bot)
28637455Sedward {
28738797Sedward 	ttesc('?');
28838797Sedward 	ttputc(top + ' ');
28938797Sedward 	ttputc(bot + ' ');
29037455Sedward 	tt.tt_scroll_top = top;
29137455Sedward 	tt.tt_scroll_bot = bot;
29237455Sedward }
29337455Sedward 
29438563Sedward int zz_debug = 0;
29538563Sedward 
zz_set_token(t,s,n)29638563Sedward zz_set_token(t, s, n)
29737998Sedward 	char *s;
29837455Sedward {
29938563Sedward 	if (tt.tt_nmodes != tt.tt_modes)
30038563Sedward 		zz_setmodes(tt.tt_nmodes);
30138563Sedward 	if (zz_debug) {
30238563Sedward 		char buf[100];
30338563Sedward 		zz_setmodes(WWM_REV);
30438563Sedward 		(void) sprintf(buf, "%02x=", t);
30538563Sedward 		ttputs(buf);
30638563Sedward 		tt.tt_col += 3;
30737455Sedward 	}
30838797Sedward 	ttputc(0x80);
30938797Sedward 	ttputc(t + 1);
31038563Sedward 	s[n - 1] |= 0x80;
31138563Sedward 	ttwrite(s, n);
31238563Sedward 	s[n - 1] &= ~0x80;
31337998Sedward }
31437998Sedward 
31538563Sedward /*ARGSUSED*/
zz_put_token(t,s,n)31638563Sedward zz_put_token(t, s, n)
31738563Sedward 	char *s;
31837998Sedward {
31938563Sedward 	if (tt.tt_nmodes != tt.tt_modes)
32038563Sedward 		zz_setmodes(tt.tt_nmodes);
32138563Sedward 	if (zz_debug) {
32238563Sedward 		char buf[100];
32338563Sedward 		zz_setmodes(WWM_REV);
32438563Sedward 		(void) sprintf(buf, "%02x>", t);
32538563Sedward 		ttputs(buf);
32638563Sedward 		tt.tt_col += 3;
32737455Sedward 	}
32838797Sedward 	ttputc(t + 0x81);
32937455Sedward }
33037455Sedward 
zz_rint(p,n)33154374Sedward zz_rint(p, n)
33254374Sedward 	char *p;
33354374Sedward {
33454374Sedward 	register i;
33554374Sedward 	register char *q;
33654374Sedward 
33754374Sedward 	if (!zz_ecc)
33854374Sedward 		return n;
33954374Sedward 	for (i = n, q = p; --i >= 0;) {
34054374Sedward 		register c = (unsigned char) *p++;
34156710Sedward 
34256710Sedward 		if (zz_lastc == 0) {
34356710Sedward 			switch (c) {
34456710Sedward 			case 0:
34556710Sedward 				*q++ = 0;
34656710Sedward 				zz_lastc = -1;
34756710Sedward 				break;
34856710Sedward 			case 1:		/* start input ecc */
34956710Sedward 				zz_ecc = 2;
35056710Sedward 				zz_lastc = -1;
35156710Sedward 				wwnreadstat++;
35256710Sedward 				break;
35356710Sedward 			case 2:		/* ack checkpoint */
35456710Sedward 				tt.tt_ack = 1;
35556710Sedward 				zz_lastc = -1;
35656710Sedward 				wwnreadack++;
35756710Sedward 				break;
35856710Sedward 			case 3:		/* nack checkpoint */
35956710Sedward 				tt.tt_ack = -1;
36056710Sedward 				zz_lastc = -1;
36156710Sedward 				wwnreadnack++;
36256710Sedward 				break;
36356710Sedward 			default:
36456710Sedward 				zz_lastc = c;
36556710Sedward 				wwnreadec++;
36656710Sedward 			}
36756710Sedward 		} else if (zz_ecc == 1) {
36854374Sedward 			if (c)
36954374Sedward 				*q++ = c;
37056710Sedward 			else
37156710Sedward 				zz_lastc = 0;
37254374Sedward 		} else {
37356710Sedward 			if (zz_lastc < 0) {
37456710Sedward 				zz_lastc = c;
37556710Sedward 			} else if (zz_lastc == c) {
37656710Sedward 				*q++ = zz_lastc;
37756710Sedward 				zz_lastc = -1;
37854374Sedward 			} else {
37954374Sedward 				wwnreadec++;
38056710Sedward 				zz_lastc = c;
38154374Sedward 			}
38254374Sedward 		}
38354374Sedward 	}
38454374Sedward 	return q - (p - n);
38554374Sedward }
38654374Sedward 
zz_checksum(p,n)38756710Sedward zz_checksum(p, n)
38856710Sedward 	register char *p;
38956710Sedward 	register n;
39056710Sedward {
39156710Sedward 	while (--n >= 0) {
39256710Sedward 		register c = *p++ & 0x7f;
39356710Sedward 		c ^= zz_sum;
39456710Sedward 		zz_sum = c << 1 | c >> 11 & 1;
39556710Sedward 	}
39656710Sedward }
39756710Sedward 
zz_compress(flag)39856710Sedward zz_compress(flag)
39956710Sedward {
40056710Sedward 	if (flag)
40156710Sedward 		tt.tt_checksum = 0;
40256710Sedward 	else
40356710Sedward 		tt.tt_checksum = zz_checksum;
40456710Sedward }
40556710Sedward 
zz_checkpoint()40656710Sedward zz_checkpoint()
40756710Sedward {
40856710Sedward 	static char x[] = { ctrl('['), 'V', 0, 0 };
40956710Sedward 
41056710Sedward 	zz_checksum(x, sizeof x);
41156710Sedward 	ttesc('V');
41256710Sedward 	ttputc(' ' + (zz_sum & 0x3f));
41356710Sedward 	ttputc(' ' + (zz_sum >> 6 & 0x3f));
41456710Sedward 	ttflush();
41556710Sedward 	zz_sum = 0;
41656710Sedward }
41756710Sedward 
tt_zapple()41837455Sedward tt_zapple()
41937455Sedward {
42038748Sedward 	tt.tt_insspace = zz_insspace;
42137455Sedward 	tt.tt_delchar = zz_delchar;
42237455Sedward 	tt.tt_insline = zz_insline;
42337455Sedward 	tt.tt_delline = zz_delline;
42437455Sedward 	tt.tt_clreol = zz_clreol;
42537455Sedward 	tt.tt_clreos = zz_clreos;
42637455Sedward 	tt.tt_scroll_down = zz_scroll_down;
42737455Sedward 	tt.tt_scroll_up = zz_scroll_up;
42837455Sedward 	tt.tt_setscroll = zz_setscroll;
42937455Sedward 	tt.tt_availmodes = WWM_REV;
43037455Sedward 	tt.tt_wrap = 1;
43137455Sedward 	tt.tt_retain = 0;
43238563Sedward 	tt.tt_ncol = NCOL;
43338563Sedward 	tt.tt_nrow = NROW;
43438563Sedward 	tt.tt_start = zz_start;
43556710Sedward 	tt.tt_reset = zz_reset;
43637455Sedward 	tt.tt_end = zz_end;
43737455Sedward 	tt.tt_write = zz_write;
43837455Sedward 	tt.tt_putc = zz_putc;
43937455Sedward 	tt.tt_move = zz_move;
44037455Sedward 	tt.tt_clear = zz_clear;
44137455Sedward 	tt.tt_setmodes = zz_setmodes;
44237455Sedward 	tt.tt_frame = gen_frame;
44339159Sedward 	tt.tt_padc = TT_PADC_NONE;
44438675Sedward 	tt.tt_ntoken = 127;
44538563Sedward 	tt.tt_set_token = zz_set_token;
44638563Sedward 	tt.tt_put_token = zz_put_token;
44738563Sedward 	tt.tt_token_min = 1;
44838563Sedward 	tt.tt_token_max = TOKEN_MAX;
44938563Sedward 	tt.tt_set_token_cost = 2;
45038563Sedward 	tt.tt_put_token_cost = 1;
45156710Sedward 	tt.tt_compress = zz_compress;
45256710Sedward 	tt.tt_checksum = zz_checksum;
45356710Sedward 	tt.tt_checkpoint = zz_checkpoint;
45456710Sedward 	tt.tt_reset = zz_reset;
45554374Sedward 	tt.tt_rint = zz_rint;
45637455Sedward 	return 0;
45737455Sedward }
458