Files
Arquivotheca.Solaris-2.5/lib/libcurses/screen/waddch.c
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

177 lines
3.6 KiB
C
Executable File

/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ident "@(#)waddch.c 1.7 93/05/05 SMI" /* SVr4.0 1.8 */
#include "curses_inc.h"
/*
* This routine prints the character in the current position.
* Think of it as putc.
*/
waddch(win, c)
register WINDOW *win;
register chtype c;
{
register int x = win->_curx, y = win->_cury;
register chtype rawc = _CHAR(c);
chtype rawattrs = _ATTR(c);
int rv = OK;
int savimmed = win->_immed;
int savsync = win->_sync;
win->_immed = win->_sync = FALSE ;
#ifdef DEBUG
if (outf)
if (c == rawc)
fprintf(outf, "'%c'", rawc);
else
fprintf(outf, "'%c' %o, raw %o", c, c, rawc);
#endif /* DEBUG */
win->_insmode = FALSE ;
if(_scrmax > 1 && _mbvalid(win) == ERR)
goto next;
if(_mbtrue && ISMBIT(rawc))
{
rv = _mbaddch(win,rawattrs,RBYTE(rawc));
win->_immed = savimmed;
win->_sync = savsync;
goto nextw ;
}
switch (rawc)
{
case '\n':
(void) wclrtoeol(win);
goto new_line;
case '\r':
goto move_to_begin_line;
case '\b':
if (--x < 0)
move_to_begin_line:
x = 0;
win->_curx = x;
win->_flags |= _WINMOVED;
goto out_move_only;
default:
if (rawc < ' ' || rawc == _CTRL('?'))
{
if (rawc == '\t')
{
register int newx;
register chtype space = ' ' | rawattrs;
if ((newx = x + (TABSIZE - (x % TABSIZE))) > win->_maxx)
newx = win->_maxx;
for ( ; x < newx; x++)
if (waddch(win, space) == ERR)
goto next;
}
else
{
if ((waddch(win, (chtype) '^'|rawattrs) == ERR) ||
(waddch(win, (chtype)_UNCTRL(rawc)|rawattrs) == ERR))
{
next :
rv = ERR;
}
}
x = win->_curx;
y = win->_cury;
win->_immed = savimmed;
win->_sync = savsync;
break;
}
#ifdef DEBUG
if ((win->_attrs) && outf)
fprintf(outf, "(attrs %o, %o=>%o)", win->_attrs, c, c | win->_attrs);
#endif /* DEBUG */
/* clear any partial multi-column character */
if(_scrmax > 1 && ISMBIT(win->_y[y][x]) &&
(rv = _mbclrch(win,y,x)) == ERR)
{
x = win->_curx;
y = win->_cury;
win->_immed = savimmed;
win->_sync = savsync;
break;
}
if ((c = _WCHAR(win, c)|rawattrs) != win->_y[y][x])
{
if (x < win->_firstch[y])
win->_firstch[y] = x;
if (x > win->_lastch[y])
win->_lastch[y] = x;
win->_y[y][x] = c;
#ifdef _VR3_COMPAT_CODE
if (_y16update)
win->_y16[y][x] = _TO_OCHTYPE (c);
#endif /* _VR3_COMPAT_CODE */
}
if (++x == win->_maxx)
{
new_line:
if (y == win->_bmarg)
{
if (wscrl(win, 1) == ERR)
{
rv = ERR;
if (x == win->_maxx)
--x;
#ifdef DEBUG
if (outf)
{
int i;
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 */
break;
}
else
savimmed = 1;
}
else
y++;
x = 0;
}
else
savimmed += 2;
#ifdef FULLDEBUG
if (outf)
fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
#endif /* FULLDEBUG */
break;
}
win->_cury = y;
win->_curx = x;
nextw:
/* sync with ancestor structures */
if (win->_sync)
wsyncup(win);
if (savimmed == 3)
return ((*_quick_ptr)(win, c));
win->_flags |= _WINCHANGED;
out_move_only:
return ((savimmed == 1) ? wrefresh(win) : rv);
}