1 /*
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)xx.c 8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14
15 #include "ww.h"
16 #include "xx.h"
17 #include "tt.h"
18
xxinit()19 xxinit()
20 {
21 if (ttinit() < 0)
22 return -1;
23 xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
24 /* ccinit may choose to change xxbufsize */
25 if (tt.tt_ntoken > 0 && ccinit() < 0)
26 return -1;
27 xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
28 if (xxbuf == 0) {
29 wwerrno = WWE_NOMEM;
30 return -1;
31 }
32 xxbufp = xxbuf;
33 xxbufe = xxbuf + xxbufsize;
34 return 0;
35 }
36
xxstart()37 xxstart()
38 {
39 (*tt.tt_start)();
40 if (tt.tt_ntoken > 0)
41 ccstart();
42 xxreset1(); /* might be a restart */
43 }
44
xxreset()45 xxreset()
46 {
47 if (tt.tt_ntoken > 0)
48 ccreset();
49 xxreset1();
50 (*tt.tt_reset)();
51 }
52
xxreset1()53 xxreset1()
54 {
55 register struct xx *xp, *xq;
56
57 for (xp = xx_head; xp != 0; xp = xq) {
58 xq = xp->link;
59 xxfree(xp);
60 }
61 xx_tail = xx_head = 0;
62 xxbufp = xxbuf;
63 }
64
xxend()65 xxend()
66 {
67 if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
68 /* tt.tt_setscroll is known to be defined */
69 (*tt.tt_setscroll)(0, tt.tt_nrow - 1);
70 if (tt.tt_modes)
71 (*tt.tt_setmodes)(0);
72 if (tt.tt_scroll_down)
73 (*tt.tt_scroll_down)(1);
74 (*tt.tt_move)(tt.tt_nrow - 1, 0);
75 if (tt.tt_ntoken > 0)
76 ccend();
77 (*tt.tt_end)();
78 ttflush();
79 }
80
81 struct xx *
xxalloc()82 xxalloc()
83 {
84 register struct xx *xp;
85
86 if (xxbufp > xxbufe)
87 abort();
88 if ((xp = xx_freelist) == 0)
89 /* XXX can't deal with failure */
90 xp = (struct xx *) malloc((unsigned) sizeof *xp);
91 else
92 xx_freelist = xp->link;
93 if (xx_head == 0)
94 xx_head = xp;
95 else
96 xx_tail->link = xp;
97 xx_tail = xp;
98 xp->link = 0;
99 return xp;
100 }
101
xxfree(xp)102 xxfree(xp)
103 register struct xx *xp;
104 {
105 xp->link = xx_freelist;
106 xx_freelist = xp;
107 }
108
xxmove(row,col)109 xxmove(row, col)
110 {
111 register struct xx *xp = xx_tail;
112
113 if (xp == 0 || xp->cmd != xc_move) {
114 xp = xxalloc();
115 xp->cmd = xc_move;
116 }
117 xp->arg0 = row;
118 xp->arg1 = col;
119 }
120
xxscroll(dir,top,bot)121 xxscroll(dir, top, bot)
122 {
123 register struct xx *xp = xx_tail;
124
125 if (xp != 0 && xp->cmd == xc_scroll &&
126 xp->arg1 == top && xp->arg2 == bot &&
127 (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) {
128 xp->arg0 += dir;
129 return;
130 }
131 xp = xxalloc();
132 xp->cmd = xc_scroll;
133 xp->arg0 = dir;
134 xp->arg1 = top;
135 xp->arg2 = bot;
136 }
137
xxinschar(row,col,c,m)138 xxinschar(row, col, c, m)
139 {
140 register struct xx *xp;
141
142 xp = xxalloc();
143 xp->cmd = xc_inschar;
144 xp->arg0 = row;
145 xp->arg1 = col;
146 xp->arg2 = c;
147 xp->arg3 = m;
148 }
149
xxinsspace(row,col)150 xxinsspace(row, col)
151 {
152 register struct xx *xp = xx_tail;
153
154 if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row &&
155 col >= xp->arg1 && col <= xp->arg1 + xp->arg2) {
156 xp->arg2++;
157 return;
158 }
159 xp = xxalloc();
160 xp->cmd = xc_insspace;
161 xp->arg0 = row;
162 xp->arg1 = col;
163 xp->arg2 = 1;
164 }
165
xxdelchar(row,col)166 xxdelchar(row, col)
167 {
168 register struct xx *xp = xx_tail;
169
170 if (xp != 0 && xp->cmd == xc_delchar &&
171 xp->arg0 == row && xp->arg1 == col) {
172 xp->arg2++;
173 return;
174 }
175 xp = xxalloc();
176 xp->cmd = xc_delchar;
177 xp->arg0 = row;
178 xp->arg1 = col;
179 xp->arg2 = 1;
180 }
181
xxclear()182 xxclear()
183 {
184 register struct xx *xp;
185
186 xxreset1();
187 xp = xxalloc();
188 xp->cmd = xc_clear;
189 }
190
xxclreos(row,col)191 xxclreos(row, col)
192 {
193 register struct xx *xp = xxalloc();
194
195 xp->cmd = xc_clreos;
196 xp->arg0 = row;
197 xp->arg1 = col;
198 }
199
xxclreol(row,col)200 xxclreol(row, col)
201 {
202 register struct xx *xp = xxalloc();
203
204 xp->cmd = xc_clreol;
205 xp->arg0 = row;
206 xp->arg1 = col;
207 }
208
xxwrite(row,col,p,n,m)209 xxwrite(row, col, p, n, m)
210 char *p;
211 {
212 register struct xx *xp;
213
214 if (xxbufp + n + 1 > xxbufe)
215 xxflush(0);
216 xp = xxalloc();
217 xp->cmd = xc_write;
218 xp->arg0 = row;
219 xp->arg1 = col;
220 xp->arg2 = n;
221 xp->arg3 = m;
222 xp->buf = xxbufp;
223 bcopy(p, xxbufp, n);
224 xxbufp += n;
225 *xxbufp++ = char_sep;
226 }
227