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