- reg int x, y;
- reg WINDOW *wp;
- reg int newx;
-
- x = win->_curx;
- y = win->_cury;
-# ifdef FULLDEBUG
- fprintf(outf, "ADDCH('%c') at (%d, %d)\n", c, y, x);
-# endif
- switch (c) {
- case '\t':
- for (newx = x + (8 - (x & 07)); x < newx; x++)
- if (waddch(win, ' ') == ERR)
- return ERR;
- return OK;
-
- default:
-# ifdef FULLDEBUG
- fprintf(outf, "ADDCH: 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;
- set_ch(win, y, x, c);
- win->_y[y][x++] = c;
- if (x >= win->_maxx) {
- x = 0;
-newline:
- if (++y >= win->_maxy)
- if (win->_scroll) {
- scroll(win);
- --y;
- }
- else
- return ERR;
- }
-# ifdef FULLDEBUG
- fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
-# endif
- break;
- case '\n':
- wclrtoeol(win);
- if (!NONL)
- x = 0;
- goto newline;
- case '\r':
- x = 0;
- break;
- case '\b':
- if (--x < 0)
- x = 0;
- break;
- }
- win->_curx = x;
- win->_cury = y;
- return OK;
-}
-
-/*
- * set_ch:
- * Set the first and last change flags for this window.
- */
-static
-set_ch(win, y, x, ch)
-reg WINDOW *win;
-int y, x;
-{
-# ifdef FULLDEBUG
- fprintf(outf, "SET_CH(%0.2o, %d, %d)\n", win, y, x);
-# endif
- if (win->_y[y][x] != ch) {
- x += win->_ch_off;
- if (win->_firstch[y] == _NOCHANGE)
- win->_firstch[y] = win->_lastch[y] = x;
- else if (x < win->_firstch[y])
- win->_firstch[y] = x;
- else if (x > win->_lastch[y])
- win->_lastch[y] = x;
-# ifdef FULLDEBUG
- fprintf(outf, "SET_CH: 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
- }