xref: /csrg-svn/lib/libcurses/addbytes.c (revision 42651)
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