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 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)xx.c 8.1 (Berkeley) 6/6/93 37 * $FreeBSD: src/usr.bin/window/xx.c,v 1.2.12.1 2001/05/17 09:45:02 obrien Exp $ 38 * $DragonFly: src/usr.bin/window/xx.c,v 1.2 2003/06/17 04:29:34 dillon Exp $ 39 */ 40 41 #include "ww.h" 42 #include "xx.h" 43 #include "tt.h" 44 #include <stdlib.h> 45 46 xxinit() 47 { 48 if (ttinit() < 0) 49 return -1; 50 xxbufsize = tt.tt_nrow * tt.tt_ncol * 2; 51 /* ccinit may choose to change xxbufsize */ 52 if (tt.tt_ntoken > 0 && ccinit() < 0) 53 return -1; 54 xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf); 55 if (xxbuf == 0) { 56 wwerrno = WWE_NOMEM; 57 return -1; 58 } 59 xxbufp = xxbuf; 60 xxbufe = xxbuf + xxbufsize; 61 return 0; 62 } 63 64 xxstart() 65 { 66 (*tt.tt_start)(); 67 if (tt.tt_ntoken > 0) 68 ccstart(); 69 xxreset1(); /* might be a restart */ 70 } 71 72 xxreset() 73 { 74 if (tt.tt_ntoken > 0) 75 ccreset(); 76 xxreset1(); 77 (*tt.tt_reset)(); 78 } 79 80 xxreset1() 81 { 82 register struct xx *xp, *xq; 83 84 for (xp = xx_head; xp != 0; xp = xq) { 85 xq = xp->link; 86 xxfree(xp); 87 } 88 xx_tail = xx_head = 0; 89 xxbufp = xxbuf; 90 } 91 92 xxend() 93 { 94 if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1) 95 /* tt.tt_setscroll is known to be defined */ 96 (*tt.tt_setscroll)(0, tt.tt_nrow - 1); 97 if (tt.tt_modes) 98 (*tt.tt_setmodes)(0); 99 if (tt.tt_scroll_down) 100 (*tt.tt_scroll_down)(1); 101 (*tt.tt_move)(tt.tt_nrow - 1, 0); 102 if (tt.tt_ntoken > 0) 103 ccend(); 104 (*tt.tt_end)(); 105 ttflush(); 106 } 107 108 struct xx * 109 xxalloc() 110 { 111 register struct xx *xp; 112 113 if (xxbufp > xxbufe) 114 abort(); 115 if ((xp = xx_freelist) == 0) 116 /* XXX can't deal with failure */ 117 xp = (struct xx *) malloc((unsigned) sizeof *xp); 118 else 119 xx_freelist = xp->link; 120 if (xx_head == 0) 121 xx_head = xp; 122 else 123 xx_tail->link = xp; 124 xx_tail = xp; 125 xp->link = 0; 126 return xp; 127 } 128 129 xxfree(xp) 130 register struct xx *xp; 131 { 132 xp->link = xx_freelist; 133 xx_freelist = xp; 134 } 135 136 xxmove(row, col) 137 { 138 register struct xx *xp = xx_tail; 139 140 if (xp == 0 || xp->cmd != xc_move) { 141 xp = xxalloc(); 142 xp->cmd = xc_move; 143 } 144 xp->arg0 = row; 145 xp->arg1 = col; 146 } 147 148 xxscroll(dir, top, bot) 149 { 150 register struct xx *xp = xx_tail; 151 152 if (xp != 0 && xp->cmd == xc_scroll && 153 xp->arg1 == top && xp->arg2 == bot && 154 (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) { 155 xp->arg0 += dir; 156 return; 157 } 158 xp = xxalloc(); 159 xp->cmd = xc_scroll; 160 xp->arg0 = dir; 161 xp->arg1 = top; 162 xp->arg2 = bot; 163 } 164 165 xxinschar(row, col, c, m) 166 { 167 register struct xx *xp; 168 169 xp = xxalloc(); 170 xp->cmd = xc_inschar; 171 xp->arg0 = row; 172 xp->arg1 = col; 173 xp->arg2 = c; 174 xp->arg3 = m; 175 } 176 177 xxinsspace(row, col) 178 { 179 register struct xx *xp = xx_tail; 180 181 if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row && 182 col >= xp->arg1 && col <= xp->arg1 + xp->arg2) { 183 xp->arg2++; 184 return; 185 } 186 xp = xxalloc(); 187 xp->cmd = xc_insspace; 188 xp->arg0 = row; 189 xp->arg1 = col; 190 xp->arg2 = 1; 191 } 192 193 xxdelchar(row, col) 194 { 195 register struct xx *xp = xx_tail; 196 197 if (xp != 0 && xp->cmd == xc_delchar && 198 xp->arg0 == row && xp->arg1 == col) { 199 xp->arg2++; 200 return; 201 } 202 xp = xxalloc(); 203 xp->cmd = xc_delchar; 204 xp->arg0 = row; 205 xp->arg1 = col; 206 xp->arg2 = 1; 207 } 208 209 xxclear() 210 { 211 register struct xx *xp; 212 213 xxreset1(); 214 xp = xxalloc(); 215 xp->cmd = xc_clear; 216 } 217 218 xxclreos(row, col) 219 { 220 register struct xx *xp = xxalloc(); 221 222 xp->cmd = xc_clreos; 223 xp->arg0 = row; 224 xp->arg1 = col; 225 } 226 227 xxclreol(row, col) 228 { 229 register struct xx *xp = xxalloc(); 230 231 xp->cmd = xc_clreol; 232 xp->arg0 = row; 233 xp->arg1 = col; 234 } 235 236 xxwrite(row, col, p, n, m) 237 char *p; 238 { 239 register struct xx *xp; 240 241 if (xxbufp + n + 1 > xxbufe) 242 xxflush(0); 243 xp = xxalloc(); 244 xp->cmd = xc_write; 245 xp->arg0 = row; 246 xp->arg1 = col; 247 xp->arg2 = n; 248 xp->arg3 = m; 249 xp->buf = xxbufp; 250 bcopy(p, xxbufp, n); 251 xxbufp += n; 252 *xxbufp++ = char_sep; 253 } 254