2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License, Version 1.0 only
2N/A * (the "License"). You may not use this file except in compliance
2N/A * with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/* Copyright (c) 1988 AT&T */
2N/A/* All Rights Reserved */
2N/A
2N/A
2N/A/*
2N/A * Copyright (c) 1997, by Sun Microsystems, Inc.
2N/A * All rights reserved.
2N/A */
2N/A
2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A
2N/A/*LINTLIBRARY*/
2N/A
2N/A#include <sys/types.h>
2N/A#include "curses_inc.h"
2N/A
2N/A/*
2N/A * Shift right an interval of characters
2N/A */
2N/A
2N/Aint
2N/A_mbinsshift(WINDOW *win, int len)
2N/A{
2N/A int x, y, maxx, mv;
2N/A chtype *wcp, *wp, *ep;
2N/A
2N/A y = win->_cury;
2N/A x = win->_curx;
2N/A maxx = win->_maxx;
2N/A wcp = win->_y[y];
2N/A
2N/A /* ASSERT(!ISCBIT(wcp[x])); */
2N/A
2N/A /* shift up to a whole character */
2N/A if (_scrmax > 1) {
2N/A wp = wcp + maxx - 1;
2N/A if (ISMBIT(*wp)) {
2N/A reg chtype rb;
2N/A
2N/A for (; wp >= wcp; --wp)
2N/A if (!ISCBIT(*wp))
2N/A break;
2N/A if (wp < wcp)
2N/A return (ERR);
2N/A rb = RBYTE(*wp);
2N/A if ((wp + _curs_scrwidth[TYPE(rb)]) > (wcp + maxx))
2N/A /*LINTED*/
2N/A maxx = (int)(wp - wcp);
2N/A }
2N/A }
2N/A
2N/A /* see if any data need to move */
2N/A if ((mv = maxx - (x+len)) <= 0)
2N/A return (OK);
2N/A
2N/A /* the end of the moved interval must be whole */
2N/A if (ISCBIT(wcp[x + mv]))
2N/A (void) _mbclrch(win, y, x + mv - 1);
2N/A
2N/A /* move data */
2N/A ep = wcp + x + len;
2N/A for (wp = wcp + maxx - 1; wp >= ep; --wp)
2N/A *wp = *(wp - len);
2N/A
2N/A /* clear a possible partial multibyte character */
2N/A if (ISMBIT(*wp))
2N/A for (ep = wp; ep >= wcp; --ep) {
2N/A mv = (int)(ISCBIT(*ep));
2N/A *ep = win->_bkgd;
2N/A if (!mv)
2N/A break;
2N/A }
2N/A
2N/A /* update the change structure */
2N/A if (x < win->_firstch[y])
2N/A /*LINTED*/
2N/A win->_firstch[y] = (short)x;
2N/A win->_lastch[y] = maxx - 1;
2N/A
2N/A return (OK);
2N/A}