|
|
researchv10 Norman
# include "curses.ext"
/* @(#) addch.c: 1.1 10/15/83 (1.5 11/18/82) */
/*
* This routine prints the character in the current position.
* Think of it as putc.
*
* 3/5/81 (Berkeley) @(#)addch.c 1.3
*/
waddch(win, c)
register WINDOW *win;
register chtype c;
{
register int x, y;
char *uctr;
register char rawc = c & A_CHARTEXT;
x = win->_curx;
y = win->_cury;
# ifdef DEBUG
if (outf)
if (c == rawc)
fprintf(outf, "'%c'", rawc);
else
fprintf(outf, "'%c' %o, raw %o", c, c, rawc);
# endif
if (y >= win->_maxy || x >= win->_maxx || y < 0 || x < 0)
{
# ifdef DEBUG
if(outf)
{
fprintf(outf,"off edge, (%d,%d) not in (%d,%d)\n",y,x,win->_maxy,win->_maxx);
}
# endif
return ERR;
}
switch( rawc )
{
case '\t':
{
register int newx;
for( newx = x + (8 - (x & 07)); x < newx; x++ )
{
if( waddch(win, ' ') == ERR )
{
return ERR;
}
}
return OK;
}
default:
if( rawc < ' ' || rawc > '~' )
{
uctr = unctrl(rawc);
waddch(win, (chtype)uctr[0]|(c&A_ATTRIBUTES));
waddch(win, (chtype)uctr[1]|(c&A_ATTRIBUTES));
return OK;
}
if( win->_attrs )
{
#ifdef DEBUG
if(outf) fprintf(outf, "(attrs %o, %o=>%o)", win->_attrs, c, c | win->_attrs);
#endif DEBUG
c |= win->_attrs;;
}
if( win->_y[y][x] != c )
{
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;
}
}
}
}
win->_y[y][x++] = c;
if (x >= win->_maxx)
{
x = 0;
new_line:
if (++y > win->_bmarg)
{
if (win->_scroll && !(win->_flags&_ISPAD))
{
#ifdef DEBUG
if(outf)
{
fprintf( outf, "Calling wrefresh( 0%o ) & _tscroll( 0%o )\n",
win, win );
}
#endif DEBUG
wrefresh(win);
_tscroll( win );
--y;
}
else
{
# ifdef DEBUG
int i;
if(outf)
{
fprintf(outf,
"ERR because (%d,%d) > (%d,%d)\n",
x, y, win->_maxx, win->_maxy);
fprintf(outf, "line: '");
for (i=0; i<win->_maxy; i++)
fprintf(outf, "%c",
win->_y[y-1][i]);
fprintf(outf, "'\n");
}
# endif DEBUG
return ERR;
}
}
}
# ifdef DEBUG
if(outf) fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
# endif DEBUG
break;
case '\n':
wclrtoeol(win);
x = 0;
goto new_line;
case '\r':
x = 0;
break;
case '\b':
if (--x < 0)
x = 0;
break;
}
win->_curx = x;
win->_cury = y;
return OK;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.