/* Public Domain Curses */

#include <curspriv.h>

RCSID("$Id: clear.c,v 1.35 2008/07/13 16:08:18 wmcbrine Exp $")

/*man-start**************************************************************

  Name:                                                         clear

  Synopsis:
        int clear(void);
        int wclear(WINDOW *win);
        int erase(void);
        int werase(WINDOW *win);
        int clrtobot(void);
        int wclrtobot(WINDOW *win);
        int clrtoeol(void);
        int wclrtoeol(WINDOW *win);

  Description:
        erase() and werase() copy blanks (i.e. the background chtype) to
        every cell of the window.

        clear() and wclear() are similar to erase() and werase(), but
        they also call clearok() to ensure that the the window is
        cleared on the next wrefresh().

        clrtobot() and wclrtobot() clear the window from the current
        cursor position to the end of the window.

        clrtoeol() and wclrtoeol() clear the window from the current
        cursor position to the end of the current line.

  Return Value:
        All functions return OK on success and ERR on error.

  Portability                                X/Open    BSD    SYS V
        clear                                   Y       Y       Y
        wclear                                  Y       Y       Y
        erase                                   Y       Y       Y
        werase                                  Y       Y       Y
        clrtobot                                Y       Y       Y
        wclrtobot                               Y       Y       Y
        clrtoeol                                Y       Y       Y
        wclrtoeol                               Y       Y       Y

**man-end****************************************************************/

int wclrtoeol(WINDOW *win)
{
    int x, y, minx;
    chtype blank, *ptr;

    PDC_LOG(("wclrtoeol() - called: Row: %d Col: %d\n",
             win->_cury, win->_curx));

    if (!win)
        return ERR;

    y = win->_cury;
    x = win->_curx;

    /* wrs (4/10/93) account for window background */

    blank = win->_bkgd;

    for (minx = x, ptr = &win->_y[y][x]; minx < win->_maxx; minx++, ptr++)
        *ptr = blank;

    if (x < win->_firstch[y] || win->_firstch[y] == _NO_CHANGE)
        win->_firstch[y] = x;

    win->_lastch[y] = win->_maxx - 1;

    PDC_sync(win);
    return OK;
}

int clrtoeol(void)
{
    PDC_LOG(("clrtoeol() - called\n"));

    return wclrtoeol(stdscr);
}

int wclrtobot(WINDOW *win)
{
    int savey = win->_cury;
    int savex = win->_curx;

    PDC_LOG(("wclrtobot() - called\n"));

    if (!win)
        return ERR;

    /* should this involve scrolling region somehow ? */

    if (win->_cury + 1 < win->_maxy)
    {
        win->_curx = 0;
        win->_cury++;
        for (; win->_maxy > win->_cury; win->_cury++)
            wclrtoeol(win);
        win->_cury = savey;
        win->_curx = savex;
    }
    wclrtoeol(win);

    PDC_sync(win);
    return OK;
}

int clrtobot(void)
{
    PDC_LOG(("clrtobot() - called\n"));

    return wclrtobot(stdscr);
}

int werase(WINDOW *win)
{
    PDC_LOG(("werase() - called\n"));

    if (wmove(win, 0, 0) == ERR)
        return ERR;

    return wclrtobot(win);
}

int erase(void)
{
    PDC_LOG(("erase() - called\n"));

    return werase(stdscr);
}

int wclear(WINDOW *win)
{
    PDC_LOG(("wclear() - called\n"));

    if (!win)
        return ERR;

    win->_clear = TRUE;
    return werase(win);
}

int clear(void)
{
    PDC_LOG(("clear() - called\n"));

    return wclear(stdscr);
}
