1 /* $NetBSD: addbytes.c,v 1.22 2001/04/20 12:56:08 jdc Exp $ */ 2 3 /* 4 * Copyright (c) 1987, 1993, 1994 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include <sys/cdefs.h> 37 #ifndef lint 38 #if 0 39 static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94"; 40 #else 41 __RCSID("$NetBSD: addbytes.c,v 1.22 2001/04/20 12:56:08 jdc Exp $"); 42 #endif 43 #endif /* not lint */ 44 45 #include "curses.h" 46 #include "curses_private.h" 47 48 #define SYNCH_IN {y = win->cury; x = win->curx;} 49 #define SYNCH_OUT {win->cury = y; win->curx = x;} 50 51 #ifndef _CURSES_USE_MACROS 52 53 /* 54 * addbytes -- 55 * Add the character to the current position in stdscr. 56 */ 57 int 58 addbytes(const char *bytes, int count) 59 { 60 return __waddbytes(stdscr, bytes, count, 0); 61 } 62 63 /* 64 * waddbytes -- 65 * Add the character to the current position in the given window. 66 */ 67 int 68 waddbytes(WINDOW *win, const char *bytes, int count) 69 { 70 return __waddbytes(win, bytes, count, 0); 71 } 72 73 /* 74 * mvaddbytes -- 75 * Add the characters to stdscr at the location given. 76 */ 77 int 78 mvaddbytes(int y, int x, const char *bytes, int count) 79 { 80 return mvwaddbytes(stdscr, y, x, bytes, count); 81 } 82 83 /* 84 * mvwaddbytes -- 85 * Add the characters to the given window at the location given. 86 */ 87 int 88 mvwaddbytes(WINDOW *win, int y, int x, const char *bytes, int count) 89 { 90 if (wmove(win, y, x) == ERR) 91 return ERR; 92 93 return __waddbytes(win, bytes, count, 0); 94 } 95 96 #endif 97 98 /* 99 * waddbytes -- 100 * Add the character to the current position in the given window. 101 */ 102 int 103 __waddbytes(WINDOW *win, const char *bytes, int count, attr_t attr) 104 { 105 static char blanks[] = " "; 106 int c, newx, x, y; 107 attr_t attributes; 108 __LINE *lp; 109 110 SYNCH_IN; 111 112 while (count--) { 113 c = *bytes++; 114 #ifdef DEBUG 115 __CTRACE("ADDBYTES('%c', %x) at (%d, %d)\n", c, attr, y, x); 116 #endif 117 switch (c) { 118 case '\t': 119 SYNCH_OUT; 120 if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) 121 return (ERR); 122 SYNCH_IN; 123 break; 124 125 default: 126 #ifdef DEBUG 127 __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); 128 #endif 129 130 lp = win->lines[y]; 131 if (lp->flags & __ISPASTEOL) { 132 lp->flags &= ~__ISPASTEOL; 133 newline: if (y == win->scr_b) { 134 #ifdef DEBUG 135 __CTRACE("ADDBYTES - on bottom of scrolling region\n"); 136 #endif 137 if (win->flags & __SCROLLOK) { 138 SYNCH_OUT; 139 scroll(win); 140 SYNCH_IN; 141 lp = win->lines[y]; 142 x = 0; 143 } else 144 return (ERR); 145 } else { 146 y++; 147 lp = win->lines[y]; 148 x = 0; 149 } 150 if (c == '\n') 151 break; 152 } 153 154 attributes = (win->wattr | attr) & 155 (__ATTRIBUTES & ~__COLOR); 156 if (attr & __COLOR) 157 attributes |= attr & __COLOR; 158 else if (win->wattr & __COLOR) 159 attributes |= win->wattr & __COLOR; 160 #ifdef DEBUG 161 __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", 162 y, x, *win->lines[y]->firstchp, 163 *win->lines[y]->lastchp); 164 #endif 165 if (lp->line[x].ch != c || 166 lp->line[x].attr != attributes || 167 lp->line[x].bch != win->bch || 168 lp->line[x].battr != win->battr) { 169 newx = x + win->ch_off; 170 lp->flags |= __ISDIRTY; 171 /* 172 * firstchp/lastchp are shared between 173 * parent window and sub-window. 174 */ 175 if (newx < *lp->firstchp) 176 *lp->firstchp = newx; 177 if (newx > *lp->lastchp) 178 *lp->lastchp = newx; 179 #ifdef DEBUG 180 __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", 181 *lp->firstchp, *lp->lastchp, 182 *lp->firstchp - win->ch_off, 183 *lp->lastchp - win->ch_off); 184 #endif 185 } 186 lp->line[x].ch = c; 187 lp->line[x].bch = win->bch; 188 lp->line[x].attr = attributes; 189 lp->line[x].battr = win->battr; 190 if (x == win->maxx - 1) 191 lp->flags |= __ISPASTEOL; 192 else 193 x++; 194 #ifdef DEBUG 195 __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", 196 y, x, *win->lines[y]->firstchp, 197 *win->lines[y]->lastchp); 198 #endif 199 break; 200 case '\n': 201 SYNCH_OUT; 202 wclrtoeol(win); 203 SYNCH_IN; 204 if (!__NONL) 205 x = 0; 206 goto newline; 207 case '\r': 208 x = 0; 209 break; 210 case '\b': 211 if (--x < 0) 212 x = 0; 213 break; 214 } 215 } 216 SYNCH_OUT; 217 return (OK); 218 } 219