xref: /csrg-svn/usr.bin/window/xx.c (revision 38564)
1*38564Sedward /*
2*38564Sedward  * Copyright (c) 1989 Regents of the University of California.
3*38564Sedward  * All rights reserved.
4*38564Sedward  *
5*38564Sedward  * Redistribution and use in source and binary forms are permitted
6*38564Sedward  * provided that the above copyright notice and this paragraph are
7*38564Sedward  * duplicated in all such forms and that any documentation,
8*38564Sedward  * advertising materials, and other materials related to such
9*38564Sedward  * distribution and use acknowledge that the software was developed
10*38564Sedward  * by the University of California, Berkeley.  The name of the
11*38564Sedward  * University may not be used to endorse or promote products derived
12*38564Sedward  * from this software without specific prior written permission.
13*38564Sedward  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14*38564Sedward  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15*38564Sedward  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16*38564Sedward  */
17*38564Sedward 
18*38564Sedward #ifndef lint
19*38564Sedward static char sccsid[] = "@(#)xx.c	3.1 (Berkeley) 08/02/89";
20*38564Sedward #endif /* not lint */
21*38564Sedward 
22*38564Sedward #include "ww.h"
23*38564Sedward #include "xx.h"
24*38564Sedward #include "tt.h"
25*38564Sedward 
26*38564Sedward xxinit()
27*38564Sedward {
28*38564Sedward 	if (ttinit() < 0)
29*38564Sedward 		return -1;
30*38564Sedward 	xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
31*38564Sedward 	xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
32*38564Sedward 	if (xxbuf == 0) {
33*38564Sedward 		wwerrno = WWE_NOMEM;
34*38564Sedward 		return -1;
35*38564Sedward 	}
36*38564Sedward 	xxbufp = xxbuf;
37*38564Sedward 	xxbufe = xxbuf + xxbufsize;
38*38564Sedward 	if (tt.tt_ntoken > 0 && xcinit() < 0)
39*38564Sedward 		return -1;
40*38564Sedward 	return 0;
41*38564Sedward }
42*38564Sedward 
43*38564Sedward xxstart()
44*38564Sedward {
45*38564Sedward 	(*tt.tt_start)();
46*38564Sedward 	if (tt.tt_ntoken > 0)
47*38564Sedward 		xcstart();
48*38564Sedward 	xxreset();			/* might be a restart */
49*38564Sedward }
50*38564Sedward 
51*38564Sedward xxend()
52*38564Sedward {
53*38564Sedward 	if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
54*38564Sedward 		/* tt.tt_setscroll is known to be defined */
55*38564Sedward 		(*tt.tt_setscroll)(0, tt.tt_nrow - 1);
56*38564Sedward 	if (tt.tt_insert)
57*38564Sedward 		(*tt.tt_setinsert)(0);
58*38564Sedward 	if (tt.tt_modes)
59*38564Sedward 		(*tt.tt_setmodes)(0);
60*38564Sedward 	if (tt.tt_scroll_down)
61*38564Sedward 		(*tt.tt_scroll_down)(1);
62*38564Sedward 	(*tt.tt_move)(tt.tt_nrow - 1, 0);
63*38564Sedward 	(*tt.tt_end)();
64*38564Sedward 	ttflush();
65*38564Sedward }
66*38564Sedward 
67*38564Sedward struct xx *
68*38564Sedward xxalloc()
69*38564Sedward {
70*38564Sedward 	register struct xx *xp;
71*38564Sedward 
72*38564Sedward 	if (xxbufp > xxbufe)
73*38564Sedward 		abort();
74*38564Sedward 	if ((xp = xx_freelist) == 0)
75*38564Sedward 		/* XXX can't deal with failure */
76*38564Sedward 		xp = (struct xx *) malloc((unsigned) sizeof *xp);
77*38564Sedward 	else
78*38564Sedward 		xx_freelist = xp->link;
79*38564Sedward 	if (xx_head == 0)
80*38564Sedward 		xx_head = xp;
81*38564Sedward 	else
82*38564Sedward 		xx_tail->link = xp;
83*38564Sedward 	xx_tail = xp;
84*38564Sedward 	xp->link = 0;
85*38564Sedward 	return xp;
86*38564Sedward }
87*38564Sedward 
88*38564Sedward xxfree(xp)
89*38564Sedward 	register struct xx *xp;
90*38564Sedward {
91*38564Sedward 	xp->link = xx_freelist;
92*38564Sedward 	xx_freelist = xp;
93*38564Sedward }
94*38564Sedward 
95*38564Sedward xxmove(row, col)
96*38564Sedward {
97*38564Sedward 	register struct xx *xp = xx_tail;
98*38564Sedward 
99*38564Sedward 	if (xp == 0 || xp->cmd != xc_move) {
100*38564Sedward 		xp = xxalloc();
101*38564Sedward 		xp->cmd = xc_move;
102*38564Sedward 	}
103*38564Sedward 	xp->arg0 = row;
104*38564Sedward 	xp->arg1 = col;
105*38564Sedward }
106*38564Sedward 
107*38564Sedward xxscroll(dir, top, bot)
108*38564Sedward {
109*38564Sedward 	register struct xx *xp = xx_tail;
110*38564Sedward 
111*38564Sedward 	if (xp != 0 && xp->cmd == xc_scroll &&
112*38564Sedward 	    xp->arg1 == top && xp->arg2 == bot &&
113*38564Sedward 	    (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) {
114*38564Sedward 		xp->arg0 += dir;
115*38564Sedward 		return;
116*38564Sedward 	}
117*38564Sedward 	xp = xxalloc();
118*38564Sedward 	xp->cmd = xc_scroll;
119*38564Sedward 	xp->arg0 = dir;
120*38564Sedward 	xp->arg1 = top;
121*38564Sedward 	xp->arg2 = bot;
122*38564Sedward }
123*38564Sedward 
124*38564Sedward xxinschar(row, col, c)
125*38564Sedward {
126*38564Sedward 	register struct xx *xp = xx_tail;
127*38564Sedward 	int m = c >> WWC_MSHIFT;
128*38564Sedward 
129*38564Sedward 	if (xxbufp >= xxbufe)
130*38564Sedward 		xxflush(0);
131*38564Sedward 	c &= WWC_CMASK;
132*38564Sedward 	if (xp != 0 && xp->cmd == xc_inschar &&
133*38564Sedward 	    xp->arg0 == row && xp->arg1 + xp->arg2 == col && xp->arg3 == m) {
134*38564Sedward 		xp->buf[xp->arg2++] = c;
135*38564Sedward 		xxbufp++;
136*38564Sedward 		return;
137*38564Sedward 	}
138*38564Sedward 	xp = xxalloc();
139*38564Sedward 	xp->cmd = xc_inschar;
140*38564Sedward 	xp->arg0 = row;
141*38564Sedward 	xp->arg1 = col;
142*38564Sedward 	xp->arg2 = 1;
143*38564Sedward 	xp->arg3 = m;
144*38564Sedward 	xp->buf = xxbufp++;
145*38564Sedward 	*xp->buf = c;
146*38564Sedward }
147*38564Sedward 
148*38564Sedward xxdelchar(row, col)
149*38564Sedward {
150*38564Sedward 	register struct xx *xp = xx_tail;
151*38564Sedward 
152*38564Sedward 	if (xp != 0 && xp->cmd == xc_delchar &&
153*38564Sedward 	    xp->arg0 == row && xp->arg1 == col) {
154*38564Sedward 		xp->arg2++;
155*38564Sedward 		return;
156*38564Sedward 	}
157*38564Sedward 	xp = xxalloc();
158*38564Sedward 	xp->cmd = xc_delchar;
159*38564Sedward 	xp->arg0 = row;
160*38564Sedward 	xp->arg1 = col;
161*38564Sedward 	xp->arg2 = 1;
162*38564Sedward }
163*38564Sedward 
164*38564Sedward xxclear()
165*38564Sedward {
166*38564Sedward 	register struct xx *xp;
167*38564Sedward 
168*38564Sedward 	xxreset();
169*38564Sedward 	xp = xxalloc();
170*38564Sedward 	xp->cmd = xc_clear;
171*38564Sedward }
172*38564Sedward 
173*38564Sedward xxclreos(row, col)
174*38564Sedward {
175*38564Sedward 	register struct xx *xp = xxalloc();
176*38564Sedward 
177*38564Sedward 	xp->cmd = xc_clreos;
178*38564Sedward 	xp->arg0 = row;
179*38564Sedward 	xp->arg1 = col;
180*38564Sedward }
181*38564Sedward 
182*38564Sedward xxclreol(row, col)
183*38564Sedward {
184*38564Sedward 	register struct xx *xp = xxalloc();
185*38564Sedward 
186*38564Sedward 	xp->cmd = xc_clreol;
187*38564Sedward 	xp->arg0 = row;
188*38564Sedward 	xp->arg1 = col;
189*38564Sedward }
190*38564Sedward 
191*38564Sedward xxwrite(row, col, p, n, m)
192*38564Sedward 	char *p;
193*38564Sedward {
194*38564Sedward 	register struct xx *xp;
195*38564Sedward 
196*38564Sedward 	if (xxbufp + n > xxbufe)
197*38564Sedward 		xxflush(0);
198*38564Sedward 	xp = xxalloc();
199*38564Sedward 	xp->cmd = xc_write;
200*38564Sedward 	xp->arg0 = row;
201*38564Sedward 	xp->arg1 = col;
202*38564Sedward 	xp->arg2 = n;
203*38564Sedward 	xp->arg3 = m;
204*38564Sedward 	xp->buf = xxbufp;
205*38564Sedward 	bcopy(p, xxbufp, n);
206*38564Sedward 	xxbufp += n;
207*38564Sedward 	if (tt.tt_ntoken > 0)
208*38564Sedward 		xcscan(xp->buf, n, xp->buf - xxbuf);
209*38564Sedward }
210*38564Sedward 
211*38564Sedward xxreset()
212*38564Sedward {
213*38564Sedward 	register struct xx *xp, *xq;
214*38564Sedward 
215*38564Sedward 	for (xp = xx_head; xp != 0; xp = xq) {
216*38564Sedward 		xq = xp->link;
217*38564Sedward 		xxfree(xp);
218*38564Sedward 	}
219*38564Sedward 	xx_tail = xx_head = 0;
220*38564Sedward 	xxbufp = xxbuf;
221*38564Sedward 	if (tt.tt_ntoken > 0)
222*38564Sedward 		xcreset();
223*38564Sedward }
224