#include <sys/types.h>
#include "curses_inc.h"
int
_mbclrch(WINDOW *win, int y, int x)
{
chtype *wcp, *ep, *wp, wc;
wcp = win->_y[y];
wp = wcp + x;
if (ISCBIT(*wp)) {
for (; wp >= wcp; --wp)
if (!ISCBIT(*wp))
break;
if (wp < wcp)
return (ERR);
}
wc = RBYTE(*wp);
ep = wp + _curs_scrwidth[TYPE(wc)];
if (ep > wcp + win->_maxx)
return (ERR);
if ((x = (int)(wp - wcp)) < win->_firstch[y])
win->_firstch[y] = (short)x;
if ((x = (int)(ep - wcp) - 1) > win->_lastch[y])
win->_lastch[y] = (short)x;
for (; wp < ep; ++wp)
*wp = win->_bkgd;
return (OK);
}
int
_mbvalid(WINDOW *win)
{
chtype *wp, *wcp, *ecp, wc;
int x;
bool isedge;
x = win->_curx;
wcp = win->_y[win->_cury];
wp = wcp + x;
if (!ISMBIT(*wp))
return (OK);
ecp = wcp + win->_maxx;
isedge = FALSE;
if (ISCBIT(*wp)) {
for (; wp >= wcp; --wp)
if (!ISCBIT(*wp))
break;
if (wp < wcp) {
for (wp = wcp + x + 1; wp < ecp; ++wp)
if (!ISCBIT(*wp))
break;
if (wp >= ecp)
return (ERR);
isedge = TRUE;
}
}
wc = RBYTE(*wp);
if (wp + _curs_scrwidth[TYPE(wc)] > ecp) {
for (wp -= 1; wp >= wcp; --wp)
if (!ISCBIT(*wp))
break;
if (wp < wcp)
return (ERR);
isedge = TRUE;
}
if (isedge || win->_insmode)
win->_curx = (short)(wp-wcp);
return (OK);
}
int
_mbaddch(WINDOW *win, chtype a, chtype c)
{
int n, x, y, nc, m, len, nbyte, ty;
chtype *wcp, wc;
char *wch, rc[2];
nc = 0;
if (ISCBIT(c))
rc[nc++] = (char)(LBYTE(c)|MBIT);
if (ISMBIT(c))
rc[nc++] = (char)RBYTE(c);
a |= win->_attrs;
for (n = 0; n < nc; ++n) {
wc = RBYTE(rc[n]);
ty = TYPE(wc);
wch = win->_waitc;
if (ty > 0 || win->_nbyte < 0) {
wch[0] = (char)wc;
win->_nbyte = cswidth[ty] + (ty == 0 ? 0 : 1);
win->_index = 1;
} else {
wch[win->_index] = (char)wc;
win->_index += 1;
}
if (win->_index < win->_nbyte)
continue;
nbyte = win->_nbyte;
win->_nbyte = -1;
wc = RBYTE(wch[0]);
len = _curs_scrwidth[TYPE(wc)];
if (len > win->_maxx || 2*len < nbyte)
continue;
if ((win->_curx + len) > win->_maxx &&
(win->_insmode || waddch(win, '\n') == ERR))
continue;
y = win->_cury;
x = win->_curx;
wcp = win->_y[y] + x;
if (win->_insmode) {
if (_mbinsshift(win, len) == ERR)
continue;
} else if (_scrmax > 1) {
for (m = 0; m < len; ++m)
if (ISMBIT(wcp[m]) &&
_mbclrch(win, y, x + m) == ERR)
break;
if (m < len)
continue;
}
for (m = nbyte/2; m > 0; m -= 1, wch += 2)
*wcp++ = _CHAR((RBYTE(wch[1]) << 8) |
RBYTE(wch[0])) | CBIT | a;
if ((nbyte%2) != 0)
*wcp++ = RBYTE(wch[0]) | CBIT | a;
for (m = (nbyte / 2) + (nbyte % 2); m < len; ++m)
*wcp++ = (CBIT|MBIT) | a;
win->_y[y][x] &= ~CBIT;
if (win->_insmode == FALSE) {
if (x < win->_firstch[y])
win->_firstch[y] = (short)x;
if ((x += len-1) >= win->_maxx)
x = win->_maxx-1;
if (x > win->_lastch[y])
win->_lastch[y] = (short)x;
if ((win->_curx += len) >= win->_maxx) {
if (y >= (win->_maxy-1) || y == win->_bmarg) {
win->_curx = win->_maxx-1;
if (wscrl(win, 1) == ERR)
continue;
} else {
win->_cury += 1;
win->_curx = 0;
}
}
}
}
return (OK);
}