OpenSolaris_b135/lib/libcurses/screen/wclrtoeol.c

Compare this file to the similar file:
Show the results in this format:

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*	Copyright (c) 1988 AT&T	*/
/*	  All Rights Reserved	*/

/*
 * University Copyright- Copyright (c) 1982, 1986, 1988
 * The Regents of the University of California
 * All Rights Reserved
 *
 * University Acknowledgment- Portions of this document are derived from
 * software developed by the University of California, Berkeley, and its
 * contributors.
 */

#pragma ident	"%Z%%M%	%I%	%E% SMI"

/*LINTLIBRARY*/

#include	<sys/types.h>
#include	<stdlib.h>
#include	"curses_inc.h"

/* This routine clears up to the end of line. */

int
wclrtoeol(WINDOW *win)
{
	int	y = win->_cury;
	int	x = win->_curx;
	int	maxx = win->_maxx;
	int			cx;
	chtype		wc;

	if (win != curscr) {
		win->_nbyte = -1;
		if (_scrmax > 1) {
			if (ISMBIT(win->_y[y][x])) {
				win->_insmode = TRUE;
				if (_mbvalid(win) == ERR)
					return (ERR);
				x = win->_curx;
			}
			if (ISMBIT(win->_y[y][maxx - 1])) {
				for (cx = maxx - 1; cx >= x; --cx)
					if (!ISCBIT(win->_y[y][cx]))
						break;
				wc = RBYTE(win->_y[y][cx]);
				if (cx + _curs_scrwidth[TYPE(wc)] > maxx)
					maxx = cx - 1;
			}
		}
	}

	memSset(&win->_y[y][x], win->_bkgd, maxx - x);
	maxx = win->_maxx;

#ifdef	_VR3_COMPAT_CODE
	if (_y16update)
		(*_y16update)(win, 1, maxx - x, y, x);
#endif	/* _VR3_COMPAT_CODE */

	/* if curscr, reset blank structure */
	if (win == curscr) {
		if (_BEGNS[y] >= x)
			/* LINTED */
			_BEGNS[y] = (short) maxx;
		if (_ENDNS[y] >= x)
			_ENDNS[y] = _BEGNS[y] > x ? -1 : x-1;

		_CURHASH[y] = x == 0 ? 0 : _NOHASH;

		if (_MARKS != NULL) {
			char	*mkp = _MARKS[y];
			int	endx = COLS /
				BITSPERBYTE + (COLS  %BITSPERBYTE ? 1 : 0);
			int	m = x / BITSPERBYTE + 1;

			for (; m < endx; ++m)
				mkp[m] = 0;
			mkp += x / BITSPERBYTE;
			if ((m = x % BITSPERBYTE) == 0)
				*mkp = 0;
			else
				for (; m < BITSPERBYTE; ++m)
					*mkp &= ~(1 << m);

			/* if color terminal, do the same for color marks */

			if (_COLOR_MARKS != NULL) {
				mkp = _COLOR_MARKS[y];

				m = x / BITSPERBYTE + 1;
				for (; m < endx; ++m)
					mkp[m] = 0;
				mkp += x / BITSPERBYTE;
				if ((m = x % BITSPERBYTE) == 0)
					*mkp = 0;
				else
					for (; m < BITSPERBYTE; ++m)
						*mkp &= ~(1 << m);
			}
		}
		return (OK);
	} else {
		/* update firstch and lastch for the line. */
#ifdef	DEBUG
	if (outf)
		fprintf(outf, "CLRTOEOL: line %d begx = %d, maxx = %d, "
		    "lastch = %d, next firstch %d\n", y, win->_begx,
		    win->_firstch[y], win->_lastch[y], win->_firstch[y+1]);
#endif	/* DEBUG */

		if (win->_firstch[y] > x)
		    /* LINTED */
		    win->_firstch[y] = (short) x;
		win->_lastch[y] = maxx - 1;
		win->_flags |= _WINCHANGED;
		/* sync with ancestors structures */
		if (win->_sync)
			wsyncup(win);

		return (win->_immed ? wrefresh(win) : OK);
	}
}