1*716747aaSmikel /* $NetBSD: addbytes.c,v 1.11 1997/07/22 07:36:20 mikel Exp $ */ 2*716747aaSmikel 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 36*716747aaSmikel #include <sys/cdefs.h> 3761f28255Scgd #ifndef lint 38*716747aaSmikel #if 0 39d29088daScgd static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94"; 40*716747aaSmikel #else 41*716747aaSmikel __RCSID("$NetBSD: addbytes.c,v 1.11 1997/07/22 07:36:20 mikel Exp $"); 42*716747aaSmikel #endif 4361f28255Scgd #endif /* not lint */ 4461f28255Scgd 45d29088daScgd #include "curses.h" 4661f28255Scgd 47019bbd13Scgd #define SYNCH_IN {y = win->cury; x = win->curx;} 48019bbd13Scgd #define SYNCH_OUT {win->cury = y; win->curx = x;} 4975de25bbSalm 5061f28255Scgd /* 5162a3457dSmycroft * waddbytes -- 5262a3457dSmycroft * Add the character to the current position in the given window. 5361f28255Scgd */ 5462a3457dSmycroft int 55019bbd13Scgd __waddbytes(win, bytes, count, so) 5662a3457dSmycroft register WINDOW *win; 576d20662fSmycroft register const char *bytes; 5862a3457dSmycroft register int count; 59019bbd13Scgd int so; 6061f28255Scgd { 6162a3457dSmycroft static char blanks[] = " "; 6262a3457dSmycroft register int c, newx, x, y; 63019bbd13Scgd char stand; 64019bbd13Scgd __LINE *lp; 6561f28255Scgd 6662a3457dSmycroft SYNCH_IN; 6762a3457dSmycroft 68*716747aaSmikel while (count--) { 69*716747aaSmikel c = *bytes++; 7062a3457dSmycroft #ifdef DEBUG 71019bbd13Scgd __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x); 7262a3457dSmycroft #endif 7361f28255Scgd switch (c) { 7461f28255Scgd case '\t': 7562a3457dSmycroft SYNCH_OUT; 7662a3457dSmycroft if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) 7762a3457dSmycroft return (ERR); 7862a3457dSmycroft SYNCH_IN; 7961f28255Scgd break; 8061f28255Scgd 8161f28255Scgd default: 8262a3457dSmycroft #ifdef DEBUG 83019bbd13Scgd __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); 8461f28255Scgd #endif 85019bbd13Scgd 86019bbd13Scgd lp = win->lines[y]; 87019bbd13Scgd if (lp->flags & __ISPASTEOL) { 88019bbd13Scgd lp->flags &= ~__ISPASTEOL; 89019bbd13Scgd newline: if (y == win->maxy - 1) { 90019bbd13Scgd if (win->flags & __SCROLLOK) { 9162a3457dSmycroft SYNCH_OUT; 9261f28255Scgd scroll(win); 9362a3457dSmycroft SYNCH_IN; 94019bbd13Scgd lp = win->lines[y]; 95019bbd13Scgd x = 0; 96d29088daScgd } else 97d29088daScgd return (ERR); 98019bbd13Scgd } else { 99019bbd13Scgd y++; 100019bbd13Scgd lp = win->lines[y]; 101019bbd13Scgd x = 0; 102019bbd13Scgd } 103019bbd13Scgd if (c == '\n') 104019bbd13Scgd break; 105019bbd13Scgd } 106019bbd13Scgd 107019bbd13Scgd stand = '\0'; 108019bbd13Scgd if (win->flags & __WSTANDOUT || so) 109019bbd13Scgd stand |= __STANDOUT; 11062a3457dSmycroft #ifdef DEBUG 111019bbd13Scgd __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", 112019bbd13Scgd y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); 113019bbd13Scgd #endif 114019bbd13Scgd if (lp->line[x].ch != c || 115019bbd13Scgd !(lp->line[x].attr & stand)) { 116019bbd13Scgd newx = x + win->ch_off; 117019bbd13Scgd if (!(lp->flags & __ISDIRTY)) { 118019bbd13Scgd lp->flags |= __ISDIRTY; 119019bbd13Scgd *lp->firstchp = *lp->lastchp = newx; 120019bbd13Scgd } 121019bbd13Scgd else if (newx < *lp->firstchp) 122019bbd13Scgd *lp->firstchp = newx; 123019bbd13Scgd else if (newx > *lp->lastchp) 124019bbd13Scgd *lp->lastchp = newx; 125019bbd13Scgd #ifdef DEBUG 126019bbd13Scgd __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", 127019bbd13Scgd *lp->firstchp, *lp->lastchp, 128019bbd13Scgd *lp->firstchp - win->ch_off, 129019bbd13Scgd *lp->lastchp - win->ch_off); 130019bbd13Scgd #endif 131019bbd13Scgd } 132019bbd13Scgd lp->line[x].ch = c; 133019bbd13Scgd if (stand) 134019bbd13Scgd lp->line[x].attr |= __STANDOUT; 135019bbd13Scgd else 136019bbd13Scgd lp->line[x].attr &= ~__STANDOUT; 137019bbd13Scgd if (x == win->maxx - 1) 138019bbd13Scgd lp->flags |= __ISPASTEOL; 139019bbd13Scgd else 140019bbd13Scgd x++; 141019bbd13Scgd #ifdef DEBUG 142019bbd13Scgd __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", 143019bbd13Scgd y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); 14461f28255Scgd #endif 14561f28255Scgd break; 14661f28255Scgd case '\n': 14762a3457dSmycroft SYNCH_OUT; 14861f28255Scgd wclrtoeol(win); 14962a3457dSmycroft SYNCH_IN; 150019bbd13Scgd if (!NONL) 15161f28255Scgd x = 0; 15261f28255Scgd goto newline; 15361f28255Scgd case '\r': 15461f28255Scgd x = 0; 15561f28255Scgd break; 15661f28255Scgd case '\b': 15761f28255Scgd if (--x < 0) 15861f28255Scgd x = 0; 15961f28255Scgd break; 16061f28255Scgd } 16161f28255Scgd } 16262a3457dSmycroft SYNCH_OUT; 16362a3457dSmycroft return (OK); 16461f28255Scgd } 165