131681Sminshall /* 231681Sminshall * Copyright (c) 1987 Regents of the University of California. 334677Sbostic * All rights reserved. 434677Sbostic * 5*42651Sbostic * %sccs.include.redist.c% 631681Sminshall */ 731681Sminshall 831681Sminshall #ifndef lint 9*42651Sbostic static char sccsid[] = "@(#)addbytes.c 5.4 (Berkeley) 06/01/90"; 1034677Sbostic #endif /* not lint */ 1131681Sminshall 1231681Sminshall # include "curses.ext" 1331681Sminshall 1431681Sminshall /* 1531681Sminshall * This routine adds the character to the current position 1631681Sminshall * 1731681Sminshall */ 1831681Sminshall waddbytes(win, bytes, count) 1931681Sminshall reg WINDOW *win; 2031681Sminshall reg char *bytes; 2131681Sminshall reg int count; 2231681Sminshall { 2331681Sminshall #define SYNCH_OUT() {win->_cury = y; win->_curx = x;} 2431681Sminshall #define SYNCH_IN() {y = win->_cury; x = win->_curx;} 2531681Sminshall reg int x, y; 2631681Sminshall reg int newx; 2731681Sminshall 2831681Sminshall SYNCH_IN(); 2931681Sminshall # ifdef FULLDEBUG 3031681Sminshall fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x); 3131681Sminshall # endif 3231681Sminshall while (count--) { 3331681Sminshall register int c; 3431681Sminshall static char blanks[] = " "; 3531681Sminshall 3631681Sminshall c = *bytes++; 3731681Sminshall switch (c) { 3831681Sminshall case '\t': 3931681Sminshall SYNCH_IN(); 4031681Sminshall if (waddbytes(win, blanks, 8-(x%8)) == ERR) { 4131681Sminshall return ERR; 4231681Sminshall } 4331681Sminshall SYNCH_OUT(); 4431681Sminshall break; 4531681Sminshall 4631681Sminshall default: 4731681Sminshall # ifdef FULLDEBUG 4831681Sminshall fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); 4931681Sminshall # endif 5031681Sminshall if (win->_flags & _STANDOUT) 5131681Sminshall c |= _STANDOUT; 5231681Sminshall { 5331681Sminshall # ifdef FULLDEBUG 5431681Sminshall fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x); 5531681Sminshall # endif 5631681Sminshall if (win->_y[y][x] != c) { 5731681Sminshall newx = x + win->_ch_off; 5831681Sminshall if (win->_firstch[y] == _NOCHANGE) { 5931681Sminshall win->_firstch[y] = 6031681Sminshall win->_lastch[y] = newx; 6131681Sminshall } else if (newx < win->_firstch[y]) 6231681Sminshall win->_firstch[y] = newx; 6331681Sminshall else if (newx > win->_lastch[y]) 6431681Sminshall win->_lastch[y] = newx; 6531681Sminshall # ifdef FULLDEBUG 6631681Sminshall fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", 6731681Sminshall win->_firstch[y], win->_lastch[y], 6831681Sminshall win->_firstch[y] - win->_ch_off, 6931681Sminshall win->_lastch[y] - win->_ch_off); 7031681Sminshall # endif 7131681Sminshall } 7231681Sminshall } 7331681Sminshall win->_y[y][x++] = c; 7431681Sminshall if (x >= win->_maxx) { 7531681Sminshall x = 0; 7631681Sminshall newline: 7731681Sminshall if (++y >= win->_maxy) 7831681Sminshall if (win->_scroll) { 7931681Sminshall SYNCH_OUT(); 8031681Sminshall scroll(win); 8131681Sminshall SYNCH_IN(); 8231681Sminshall --y; 8331681Sminshall } 8431681Sminshall else 8531681Sminshall return ERR; 8631681Sminshall } 8731681Sminshall # ifdef FULLDEBUG 8831681Sminshall fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); 8931681Sminshall # endif 9031681Sminshall break; 9131681Sminshall case '\n': 9231681Sminshall SYNCH_OUT(); 9331681Sminshall wclrtoeol(win); 9431681Sminshall SYNCH_IN(); 9531681Sminshall if (!NONL) 9631681Sminshall x = 0; 9731681Sminshall goto newline; 9831681Sminshall case '\r': 9931681Sminshall x = 0; 10031681Sminshall break; 10131681Sminshall case '\b': 10231681Sminshall if (--x < 0) 10331681Sminshall x = 0; 10431681Sminshall break; 10531681Sminshall } 10631681Sminshall } 10731681Sminshall SYNCH_OUT(); 10831681Sminshall return OK; 10931681Sminshall } 110