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