xref: /csrg-svn/usr.bin/window/xx.c (revision 62479)
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