diff options
Diffstat (limited to 'lib/libcurses/addbytes.c')
| -rw-r--r-- | lib/libcurses/addbytes.c | 222 |
1 files changed, 116 insertions, 106 deletions
diff --git a/lib/libcurses/addbytes.c b/lib/libcurses/addbytes.c index 3d47b326acf4..dc754830636d 100644 --- a/lib/libcurses/addbytes.c +++ b/lib/libcurses/addbytes.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 1987 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,117 +32,127 @@ */ #ifndef lint -static char sccsid[] = "@(#)addbytes.c 5.4 (Berkeley) 6/1/90"; -#endif /* not lint */ +static char sccsid[] = "@(#)addbytes.c 8.2 (Berkeley) 1/9/94"; +#endif /* not lint */ -# include "curses.ext" +#include <curses.h> -waddbytes(win, bytes, count) -reg WINDOW *win; -reg char *bytes; -int count; -{ - chtype c; - reg int i; - - for (i = 0; i < count; i++) { - c = (unsigned char) *bytes++; - if (_waddbytes(win, &c, 1) == ERR) - return ERR; - } - return OK; -} +#define SYNCH_IN {y = win->cury; x = win->curx;} +#define SYNCH_OUT {win->cury = y; win->curx = x;} /* - * This routine adds the character to the current position - * + * waddbytes -- + * Add the character to the current position in the given window. */ -_waddbytes(win, bytes, count) -reg WINDOW *win; -reg chtype *bytes; -reg int count; +int +__waddbytes(win, bytes, count, so) + register WINDOW *win; + register const char *bytes; + register int count; + int so; { -#define SYNCH_OUT() {win->_cury = y; win->_curx = x;} -#define SYNCH_IN() {y = win->_cury; x = win->_curx;} - reg int x, y; - reg int newx; + static char blanks[] = " "; + register int c, newx, x, y; + char stand; + __LINE *lp; - SYNCH_IN(); - while (count--) { - register chtype c; - static chtype blanks[] = {' ',' ',' ',' ',' ',' ',' ',' '}; + SYNCH_IN; - c = *bytes++; - switch (c) { - case '\t': - SYNCH_OUT(); - if (_waddbytes(win, blanks, 8-(x%8)) == ERR) { - return ERR; - } - SYNCH_IN(); - break; +#ifdef DEBUG + __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x); +#endif + while (count--) { + c = *bytes++; + switch (c) { + case '\t': + SYNCH_OUT; + if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) + return (ERR); + SYNCH_IN; + break; - default: -# ifdef FULLDEBUG - fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); -# endif - if (win->_flags & _STANDOUT) - c |= _STANDOUT; - { -# ifdef FULLDEBUG - fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x); -# endif - if (win->_y[y][x] != c) { - newx = x + win->_ch_off; - if (win->_firstch[y] == _NOCHANGE) { - win->_firstch[y] = - win->_lastch[y] = newx; - } else if (newx < win->_firstch[y]) - win->_firstch[y] = newx; - else if (newx > win->_lastch[y]) - win->_lastch[y] = newx; -# ifdef FULLDEBUG - fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", - win->_firstch[y], win->_lastch[y], - win->_firstch[y] - win->_ch_off, - win->_lastch[y] - win->_ch_off); -# endif - } - } - win->_y[y][x++] = c; - if (x >= win->_maxx) { - x = 0; - newline: - if (++y >= win->_maxy) - if (win->_scroll) { - --y; - SYNCH_OUT(); - scroll(win); - SYNCH_IN(); - } - else - return ERR; - } -# ifdef FULLDEBUG - fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); -# endif - break; - case '\n': - SYNCH_OUT(); - wclrtoeol(win); - SYNCH_IN(); - if (!NONL) - x = 0; - goto newline; - case '\r': - x = 0; - break; - case '\b': - if (--x < 0) - x = 0; - break; - } - } - SYNCH_OUT(); - return OK; + default: +#ifdef DEBUG + __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); +#endif + + lp = win->lines[y]; + if (lp->flags & __ISPASTEOL) { + lp->flags &= ~__ISPASTEOL; +newline: if (y == win->maxy - 1) { + if (win->flags & __SCROLLOK) { + SYNCH_OUT; + scroll(win); + SYNCH_IN; + lp = win->lines[y]; + x = 0; + } + else + return ERR; + } else { + y++; + lp = win->lines[y]; + x = 0; + } + if (c == '\n') + break; + } + + stand = '\0'; + if (win->flags & __WSTANDOUT || so) + stand |= __STANDOUT; +#ifdef DEBUG + __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", + y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); +#endif + if (lp->line[x].ch != c || + !(lp->line[x].attr & stand)) { + newx = x + win->ch_off; + if (!(lp->flags & __ISDIRTY)) { + lp->flags |= __ISDIRTY; + *lp->firstchp = *lp->lastchp = newx; + } + else if (newx < *lp->firstchp) + *lp->firstchp = newx; + else if (newx > *lp->lastchp) + *lp->lastchp = newx; +#ifdef DEBUG + __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", + *lp->firstchp, *lp->lastchp, + *lp->firstchp - win->ch_off, + *lp->lastchp - win->ch_off); +#endif + } + lp->line[x].ch = c; + if (stand) + lp->line[x].attr |= __STANDOUT; + else + lp->line[x].attr &= ~__STANDOUT; + if (x == win->maxx - 1) + lp->flags |= __ISPASTEOL; + else + x++; +#ifdef DEBUG + __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", + y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); +#endif + break; + case '\n': + SYNCH_OUT; + wclrtoeol(win); + SYNCH_IN; + if (!NONL) + x = 0; + goto newline; + case '\r': + x = 0; + break; + case '\b': + if (--x < 0) + x = 0; + break; + } + } + SYNCH_OUT; + return (OK); } |
