1*40b39f92Sjdc /* $NetBSD: addbytes.c,v 1.16 2000/04/12 21:47:50 jdc Exp $ */ 2716747aaSmikel 361f28255Scgd /* 4d29088daScgd * Copyright (c) 1987, 1993, 1994 5019bbd13Scgd * The Regents of the University of California. All rights reserved. 661f28255Scgd * 761f28255Scgd * Redistribution and use in source and binary forms, with or without 861f28255Scgd * modification, are permitted provided that the following conditions 961f28255Scgd * are met: 1061f28255Scgd * 1. Redistributions of source code must retain the above copyright 1161f28255Scgd * notice, this list of conditions and the following disclaimer. 1261f28255Scgd * 2. Redistributions in binary form must reproduce the above copyright 1361f28255Scgd * notice, this list of conditions and the following disclaimer in the 1461f28255Scgd * documentation and/or other materials provided with the distribution. 1561f28255Scgd * 3. All advertising materials mentioning features or use of this software 1661f28255Scgd * must display the following acknowledgement: 1761f28255Scgd * This product includes software developed by the University of 1861f28255Scgd * California, Berkeley and its contributors. 1961f28255Scgd * 4. Neither the name of the University nor the names of its contributors 2061f28255Scgd * may be used to endorse or promote products derived from this software 2161f28255Scgd * without specific prior written permission. 2261f28255Scgd * 2361f28255Scgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2461f28255Scgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2561f28255Scgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2661f28255Scgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2761f28255Scgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2861f28255Scgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2961f28255Scgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3061f28255Scgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3161f28255Scgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3261f28255Scgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3361f28255Scgd * SUCH DAMAGE. 3461f28255Scgd */ 3561f28255Scgd 36716747aaSmikel #include <sys/cdefs.h> 3761f28255Scgd #ifndef lint 38716747aaSmikel #if 0 39d29088daScgd static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94"; 40716747aaSmikel #else 41*40b39f92Sjdc __RCSID("$NetBSD: addbytes.c,v 1.16 2000/04/12 21:47:50 jdc Exp $"); 42716747aaSmikel #endif 4361f28255Scgd #endif /* not lint */ 4461f28255Scgd 45d29088daScgd #include "curses.h" 4623464ee5Sblymn #include "curses_private.h" 4761f28255Scgd 48019bbd13Scgd #define SYNCH_IN {y = win->cury; x = win->curx;} 49019bbd13Scgd #define SYNCH_OUT {win->cury = y; win->curx = x;} 5075de25bbSalm 5161f28255Scgd /* 5262a3457dSmycroft * waddbytes -- 5362a3457dSmycroft * Add the character to the current position in the given window. 5461f28255Scgd */ 5562a3457dSmycroft int 56586d4ce1Smrg __waddbytes(win, bytes, count, attr) 570b7831a3Sperry WINDOW *win; 580b7831a3Sperry const char *bytes; 590b7831a3Sperry int count; 6023464ee5Sblymn attr_t attr; 6161f28255Scgd { 6262a3457dSmycroft static char blanks[] = " "; 630b7831a3Sperry int c, newx, x, y; 6423464ee5Sblymn attr_t attributes; 65019bbd13Scgd __LINE *lp; 6661f28255Scgd 6762a3457dSmycroft SYNCH_IN; 6862a3457dSmycroft 69716747aaSmikel while (count--) { 70716747aaSmikel c = *bytes++; 7162a3457dSmycroft #ifdef DEBUG 72*40b39f92Sjdc __CTRACE("ADDBYTES('%c', %x) at (%d, %d)\n", c, attr, y, x); 7362a3457dSmycroft #endif 7461f28255Scgd switch (c) { 7561f28255Scgd case '\t': 7662a3457dSmycroft SYNCH_OUT; 7762a3457dSmycroft if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) 7862a3457dSmycroft return (ERR); 7962a3457dSmycroft SYNCH_IN; 8061f28255Scgd break; 8161f28255Scgd 8261f28255Scgd default: 8362a3457dSmycroft #ifdef DEBUG 84019bbd13Scgd __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); 8561f28255Scgd #endif 86019bbd13Scgd 87019bbd13Scgd lp = win->lines[y]; 88019bbd13Scgd if (lp->flags & __ISPASTEOL) { 89019bbd13Scgd lp->flags &= ~__ISPASTEOL; 90019bbd13Scgd newline: if (y == win->maxy - 1) { 91019bbd13Scgd if (win->flags & __SCROLLOK) { 9262a3457dSmycroft SYNCH_OUT; 9361f28255Scgd scroll(win); 9462a3457dSmycroft SYNCH_IN; 95019bbd13Scgd lp = win->lines[y]; 96019bbd13Scgd x = 0; 97d29088daScgd } else 98d29088daScgd return (ERR); 99019bbd13Scgd } else { 100019bbd13Scgd y++; 101019bbd13Scgd lp = win->lines[y]; 102019bbd13Scgd x = 0; 103019bbd13Scgd } 104019bbd13Scgd if (c == '\n') 105019bbd13Scgd break; 106019bbd13Scgd } 107019bbd13Scgd 108586d4ce1Smrg attributes = '\0'; 10923464ee5Sblymn if (win->wattr & __STANDOUT || attr & __STANDOUT) 110586d4ce1Smrg attributes |= __STANDOUT; 11123464ee5Sblymn if (win->wattr & __UNDERSCORE || attr & __UNDERSCORE) 112586d4ce1Smrg attributes |= __UNDERSCORE; 11323464ee5Sblymn if (win->wattr & __REVERSE || attr & __REVERSE) 114586d4ce1Smrg attributes |= __REVERSE; 11523464ee5Sblymn if (win->wattr & __BLINK || attr & __BLINK) 116586d4ce1Smrg attributes |= __BLINK; 11723464ee5Sblymn if (win->wattr & __DIM || attr & __DIM) 118586d4ce1Smrg attributes |= __DIM; 11923464ee5Sblymn if (win->wattr & __BOLD || attr & __BOLD) 120586d4ce1Smrg attributes |= __BOLD; 12123464ee5Sblymn if (win->wattr & __BLANK || attr & __BLANK) 122586d4ce1Smrg attributes |= __BLANK; 12323464ee5Sblymn if (win->wattr & __PROTECT || attr & __PROTECT) 124586d4ce1Smrg attributes |= __PROTECT; 12523464ee5Sblymn if (win->wattr & __ALTCHARSET || attr & __ALTCHARSET) 12623464ee5Sblymn attributes |= __ALTCHARSET; 127*40b39f92Sjdc if (attr & __COLOR) 128*40b39f92Sjdc attributes |= attr & __COLOR; 129*40b39f92Sjdc else if (win->wattr & __COLOR) 130*40b39f92Sjdc attributes |= win->wattr & __COLOR; 13162a3457dSmycroft #ifdef DEBUG 132019bbd13Scgd __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", 133586d4ce1Smrg y, x, *win->lines[y]->firstchp, 134586d4ce1Smrg *win->lines[y]->lastchp); 135019bbd13Scgd #endif 136019bbd13Scgd if (lp->line[x].ch != c || 137*40b39f92Sjdc lp->line[x].attr != attributes) { 138019bbd13Scgd newx = x + win->ch_off; 139019bbd13Scgd if (!(lp->flags & __ISDIRTY)) { 140019bbd13Scgd lp->flags |= __ISDIRTY; 141019bbd13Scgd *lp->firstchp = *lp->lastchp = newx; 142586d4ce1Smrg } else 143586d4ce1Smrg if (newx < *lp->firstchp) 144019bbd13Scgd *lp->firstchp = newx; 145586d4ce1Smrg else 146586d4ce1Smrg if (newx > *lp->lastchp) 147019bbd13Scgd *lp->lastchp = newx; 148019bbd13Scgd #ifdef DEBUG 149019bbd13Scgd __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", 150019bbd13Scgd *lp->firstchp, *lp->lastchp, 151019bbd13Scgd *lp->firstchp - win->ch_off, 152019bbd13Scgd *lp->lastchp - win->ch_off); 153019bbd13Scgd #endif 154019bbd13Scgd } 155019bbd13Scgd lp->line[x].ch = c; 156586d4ce1Smrg if (attributes & __STANDOUT) 157019bbd13Scgd lp->line[x].attr |= __STANDOUT; 158019bbd13Scgd else 159019bbd13Scgd lp->line[x].attr &= ~__STANDOUT; 160586d4ce1Smrg if (attributes & __UNDERSCORE) 161586d4ce1Smrg lp->line[x].attr |= __UNDERSCORE; 162586d4ce1Smrg else 163586d4ce1Smrg lp->line[x].attr &= ~__UNDERSCORE; 164586d4ce1Smrg if (attributes & __REVERSE) 165586d4ce1Smrg lp->line[x].attr |= __REVERSE; 166586d4ce1Smrg else 167586d4ce1Smrg lp->line[x].attr &= ~__REVERSE; 168586d4ce1Smrg if (attributes & __BLINK) 169586d4ce1Smrg lp->line[x].attr |= __BLINK; 170586d4ce1Smrg else 171586d4ce1Smrg lp->line[x].attr &= ~__BLINK; 172586d4ce1Smrg if (attributes & __DIM) 173586d4ce1Smrg lp->line[x].attr |= __DIM; 174586d4ce1Smrg else 175586d4ce1Smrg lp->line[x].attr &= ~__DIM; 176586d4ce1Smrg if (attributes & __BOLD) 177586d4ce1Smrg lp->line[x].attr |= __BOLD; 178586d4ce1Smrg else 179586d4ce1Smrg lp->line[x].attr &= ~__BOLD; 180586d4ce1Smrg if (attributes & __BLANK) 181586d4ce1Smrg lp->line[x].attr |= __BLANK; 182586d4ce1Smrg else 183586d4ce1Smrg lp->line[x].attr &= ~__BLANK; 184586d4ce1Smrg if (attributes & __PROTECT) 185586d4ce1Smrg lp->line[x].attr |= __PROTECT; 186586d4ce1Smrg else 187586d4ce1Smrg lp->line[x].attr &= ~__PROTECT; 18823464ee5Sblymn if (attributes & __ALTCHARSET) 18923464ee5Sblymn lp->line[x].attr |= __ALTCHARSET; 19023464ee5Sblymn else 19123464ee5Sblymn lp->line[x].attr &= ~__ALTCHARSET; 192*40b39f92Sjdc if (attributes & __COLOR) { 193*40b39f92Sjdc lp->line[x].attr &= ~__COLOR; 194*40b39f92Sjdc lp->line[x].attr |= attributes & __COLOR; 195*40b39f92Sjdc } else 196*40b39f92Sjdc lp->line[x].attr &= ~__COLOR; 197019bbd13Scgd if (x == win->maxx - 1) 198019bbd13Scgd lp->flags |= __ISPASTEOL; 199019bbd13Scgd else 200019bbd13Scgd x++; 201019bbd13Scgd #ifdef DEBUG 202019bbd13Scgd __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", 203586d4ce1Smrg y, x, *win->lines[y]->firstchp, 204586d4ce1Smrg *win->lines[y]->lastchp); 20561f28255Scgd #endif 20661f28255Scgd break; 20761f28255Scgd case '\n': 20862a3457dSmycroft SYNCH_OUT; 20961f28255Scgd wclrtoeol(win); 21062a3457dSmycroft SYNCH_IN; 211019bbd13Scgd if (!NONL) 21261f28255Scgd x = 0; 21361f28255Scgd goto newline; 21461f28255Scgd case '\r': 21561f28255Scgd x = 0; 21661f28255Scgd break; 21761f28255Scgd case '\b': 21861f28255Scgd if (--x < 0) 21961f28255Scgd x = 0; 22061f28255Scgd break; 22161f28255Scgd } 22261f28255Scgd } 22362a3457dSmycroft SYNCH_OUT; 22462a3457dSmycroft return (OK); 22561f28255Scgd } 226