138564Sedward /*
2*62479Sbostic * Copyright (c) 1989, 1993
3*62479Sbostic * The Regents of the University of California. All rights reserved.
438564Sedward *
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%
938564Sedward */
1038564Sedward
1138564Sedward #ifndef lint
12*62479Sbostic static char sccsid[] = "@(#)xx.c 8.1 (Berkeley) 06/06/93";
1338564Sedward #endif /* not lint */
1438564Sedward
1538564Sedward #include "ww.h"
1638564Sedward #include "xx.h"
1738564Sedward #include "tt.h"
1838564Sedward
xxinit()1938564Sedward xxinit()
2038564Sedward {
2138564Sedward if (ttinit() < 0)
2238564Sedward return -1;
2338564Sedward xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
2439159Sedward /* ccinit may choose to change xxbufsize */
2539159Sedward if (tt.tt_ntoken > 0 && ccinit() < 0)
2638750Sedward return -1;
2738564Sedward xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
2838564Sedward if (xxbuf == 0) {
2938564Sedward wwerrno = WWE_NOMEM;
3038564Sedward return -1;
3138564Sedward }
3238564Sedward xxbufp = xxbuf;
3338564Sedward xxbufe = xxbuf + xxbufsize;
3438564Sedward return 0;
3538564Sedward }
3638564Sedward
xxstart()3738564Sedward xxstart()
3838564Sedward {
3938564Sedward (*tt.tt_start)();
4038564Sedward if (tt.tt_ntoken > 0)
4139159Sedward ccstart();
4256710Sedward xxreset1(); /* might be a restart */
4338564Sedward }
4438564Sedward
xxreset()4556710Sedward xxreset()
4656710Sedward {
4756710Sedward if (tt.tt_ntoken > 0)
4856710Sedward ccreset();
4956710Sedward xxreset1();
5056710Sedward (*tt.tt_reset)();
5156710Sedward }
5256710Sedward
xxreset1()5356710Sedward xxreset1()
5456710Sedward {
5556710Sedward register struct xx *xp, *xq;
5656710Sedward
5756710Sedward for (xp = xx_head; xp != 0; xp = xq) {
5856710Sedward xq = xp->link;
5956710Sedward xxfree(xp);
6056710Sedward }
6156710Sedward xx_tail = xx_head = 0;
6256710Sedward xxbufp = xxbuf;
6356710Sedward }
6456710Sedward
xxend()6538564Sedward xxend()
6638564Sedward {
6738564Sedward if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
6838564Sedward /* tt.tt_setscroll is known to be defined */
6938564Sedward (*tt.tt_setscroll)(0, tt.tt_nrow - 1);
7038564Sedward if (tt.tt_modes)
7138564Sedward (*tt.tt_setmodes)(0);
7238564Sedward if (tt.tt_scroll_down)
7338564Sedward (*tt.tt_scroll_down)(1);
7438564Sedward (*tt.tt_move)(tt.tt_nrow - 1, 0);
7539159Sedward if (tt.tt_ntoken > 0)
7639159Sedward ccend();
7738564Sedward (*tt.tt_end)();
7856710Sedward ttflush();
7938564Sedward }
8038564Sedward
8138564Sedward struct xx *
xxalloc()8238564Sedward xxalloc()
8338564Sedward {
8438564Sedward register struct xx *xp;
8538564Sedward
8638564Sedward if (xxbufp > xxbufe)
8738564Sedward abort();
8838564Sedward if ((xp = xx_freelist) == 0)
8938564Sedward /* XXX can't deal with failure */
9038564Sedward xp = (struct xx *) malloc((unsigned) sizeof *xp);
9138564Sedward else
9238564Sedward xx_freelist = xp->link;
9338564Sedward if (xx_head == 0)
9438564Sedward xx_head = xp;
9538564Sedward else
9638564Sedward xx_tail->link = xp;
9738564Sedward xx_tail = xp;
9838564Sedward xp->link = 0;
9938564Sedward return xp;
10038564Sedward }
10138564Sedward
xxfree(xp)10238564Sedward xxfree(xp)
10338564Sedward register struct xx *xp;
10438564Sedward {
10538564Sedward xp->link = xx_freelist;
10638564Sedward xx_freelist = xp;
10738564Sedward }
10838564Sedward
xxmove(row,col)10938564Sedward xxmove(row, col)
11038564Sedward {
11138564Sedward register struct xx *xp = xx_tail;
11238564Sedward
11338564Sedward if (xp == 0 || xp->cmd != xc_move) {
11438564Sedward xp = xxalloc();
11538564Sedward xp->cmd = xc_move;
11638564Sedward }
11738564Sedward xp->arg0 = row;
11838564Sedward xp->arg1 = col;
11938564Sedward }
12038564Sedward
xxscroll(dir,top,bot)12138564Sedward xxscroll(dir, top, bot)
12238564Sedward {
12338564Sedward register struct xx *xp = xx_tail;
12438564Sedward
12538564Sedward if (xp != 0 && xp->cmd == xc_scroll &&
12638564Sedward xp->arg1 == top && xp->arg2 == bot &&
12738564Sedward (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) {
12838564Sedward xp->arg0 += dir;
12938564Sedward return;
13038564Sedward }
13138564Sedward xp = xxalloc();
13238564Sedward xp->cmd = xc_scroll;
13338564Sedward xp->arg0 = dir;
13438564Sedward xp->arg1 = top;
13538564Sedward xp->arg2 = bot;
13638564Sedward }
13738564Sedward
xxinschar(row,col,c,m)13838747Sedward xxinschar(row, col, c, m)
13938564Sedward {
14038747Sedward register struct xx *xp;
14138747Sedward
14238747Sedward xp = xxalloc();
14338747Sedward xp->cmd = xc_inschar;
14438747Sedward xp->arg0 = row;
14538747Sedward xp->arg1 = col;
14638747Sedward xp->arg2 = c;
14738747Sedward xp->arg3 = m;
14838747Sedward }
14938747Sedward
xxinsspace(row,col)15038747Sedward xxinsspace(row, col)
15138747Sedward {
15238564Sedward register struct xx *xp = xx_tail;
15338564Sedward
15438747Sedward if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row &&
15538747Sedward col >= xp->arg1 && col <= xp->arg1 + xp->arg2) {
15638747Sedward xp->arg2++;
15738564Sedward return;
15838564Sedward }
15938564Sedward xp = xxalloc();
16038747Sedward xp->cmd = xc_insspace;
16138564Sedward xp->arg0 = row;
16238564Sedward xp->arg1 = col;
16338564Sedward xp->arg2 = 1;
16438564Sedward }
16538564Sedward
xxdelchar(row,col)16638564Sedward xxdelchar(row, col)
16738564Sedward {
16838564Sedward register struct xx *xp = xx_tail;
16938564Sedward
17038564Sedward if (xp != 0 && xp->cmd == xc_delchar &&
17138564Sedward xp->arg0 == row && xp->arg1 == col) {
17238564Sedward xp->arg2++;
17338564Sedward return;
17438564Sedward }
17538564Sedward xp = xxalloc();
17638564Sedward xp->cmd = xc_delchar;
17738564Sedward xp->arg0 = row;
17838564Sedward xp->arg1 = col;
17938564Sedward xp->arg2 = 1;
18038564Sedward }
18138564Sedward
xxclear()18238564Sedward xxclear()
18338564Sedward {
18438564Sedward register struct xx *xp;
18538564Sedward
18656710Sedward xxreset1();
18738564Sedward xp = xxalloc();
18838564Sedward xp->cmd = xc_clear;
18938564Sedward }
19038564Sedward
xxclreos(row,col)19138564Sedward xxclreos(row, col)
19238564Sedward {
19338564Sedward register struct xx *xp = xxalloc();
19438564Sedward
19538564Sedward xp->cmd = xc_clreos;
19638564Sedward xp->arg0 = row;
19738564Sedward xp->arg1 = col;
19838564Sedward }
19938564Sedward
xxclreol(row,col)20038564Sedward xxclreol(row, col)
20138564Sedward {
20238564Sedward register struct xx *xp = xxalloc();
20338564Sedward
20438564Sedward xp->cmd = xc_clreol;
20538564Sedward xp->arg0 = row;
20638564Sedward xp->arg1 = col;
20738564Sedward }
20838564Sedward
xxwrite(row,col,p,n,m)20938564Sedward xxwrite(row, col, p, n, m)
21038564Sedward char *p;
21138564Sedward {
21238564Sedward register struct xx *xp;
21338564Sedward
21438750Sedward if (xxbufp + n + 1 > xxbufe)
21538564Sedward xxflush(0);
21638564Sedward xp = xxalloc();
21738564Sedward xp->cmd = xc_write;
21838564Sedward xp->arg0 = row;
21938564Sedward xp->arg1 = col;
22038564Sedward xp->arg2 = n;
22138564Sedward xp->arg3 = m;
22238564Sedward xp->buf = xxbufp;
22338564Sedward bcopy(p, xxbufp, n);
22438564Sedward xxbufp += n;
22538750Sedward *xxbufp++ = char_sep;
22638564Sedward }
227