/* Public Domain Curses */

#include <curspriv.h>

RCSID("$Id: addchstr.c,v 1.43 2008/07/13 16:08:17 wmcbrine Exp $")

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

  Name:                                                         addchstr

  Synopsis:
        int addchstr(const chtype *ch);
        int addchnstr(const chtype *ch, int n);
        int waddchstr(WINDOW *win, const chtype *ch);
        int waddchnstr(WINDOW *win, const chtype *ch, int n);
        int mvaddchstr(int y, int x, const chtype *ch);
        int mvaddchnstr(int y, int x, const chtype *ch, int n);
        int mvwaddchstr(WINDOW *, int y, int x, const chtype *ch);
        int mvwaddchnstr(WINDOW *, int y, int x, const chtype *ch, int n);

        int add_wchstr(const cchar_t *wch);
        int add_wchnstr(const cchar_t *wch, int n);
        int wadd_wchstr(WINDOW *win, const cchar_t *wch);
        int wadd_wchnstr(WINDOW *win, const cchar_t *wch, int n);
        int mvadd_wchstr(int y, int x, const cchar_t *wch);
        int mvadd_wchnstr(int y, int x, const cchar_t *wch, int n);
        int mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wch);
        int mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wch,
                int n);

  Description:
        These routines write a chtype or cchar_t string directly into
        the window structure, starting at the current or specified
        position. The four routines with n as the last argument copy at
        most n elements, but no more than will fit on the line. If n =
        -1 then the whole string is copied, up to the maximum number
        that will fit on the line.

        The cursor position is not advanced. These routines do not check
        for newline or other special characters, nor does any line
        wrapping occur.

  Return Value:
        All functions return OK or ERR.

  Portability                                X/Open    BSD    SYS V
        addchstr                                Y       -      4.0
        waddchstr                               Y       -      4.0
        mvaddchstr                              Y       -      4.0
        mvwaddchstr                             Y       -      4.0
        addchnstr                               Y       -      4.0
        waddchnstr                              Y       -      4.0
        mvaddchnstr                             Y       -      4.0
        mvwaddchnstr                            Y       -      4.0
        add_wchstr                              Y
        wadd_wchstr                             Y
        mvadd_wchstr                            Y
        mvwadd_wchstr                           Y
        add_wchnstr                             Y
        wadd_wchnstr                            Y
        mvadd_wchnstr                           Y
        mvwadd_wchnstr                          Y

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

#include <string.h>

int waddchnstr(WINDOW *win, const chtype *ch, int n)
{
    int y, x, maxx, minx;
    chtype *ptr;

    PDC_LOG(("waddchnstr() - called: win=%p n=%d\n", win, n));

    if (!win || !ch || !n || n < -1)
        return ERR;

    x = win->_curx;
    y = win->_cury;
    ptr = &(win->_y[y][x]);

    if (n == -1 || n > win->_maxx - x)
        n = win->_maxx - x;

    minx = win->_firstch[y];
    maxx = win->_lastch[y];

    for (; n && *ch; n--, x++, ptr++, ch++)
    {
        if (*ptr != *ch)
        {
            if (x < minx || minx == _NO_CHANGE)
                minx = x;

            if (x > maxx)
                maxx = x;

            PDC_LOG(("y %d x %d minx %d maxx %d *ptr %x *ch"
                     " %x firstch: %d lastch: %d\n",
                     y, x, minx, maxx, *ptr, *ch,
                     win->_firstch[y], win->_lastch[y]));

            *ptr = *ch;
        }
    }

    win->_firstch[y] = minx;
    win->_lastch[y] = maxx;

    return OK;
}

int addchstr(const chtype *ch)
{
    PDC_LOG(("addchstr() - called\n"));

    return waddchnstr(stdscr, ch, -1);
}

int addchnstr(const chtype *ch, int n)
{
    PDC_LOG(("addchnstr() - called\n"));

    return waddchnstr(stdscr, ch, n);
}

int waddchstr(WINDOW *win, const chtype *ch)
{
    PDC_LOG(("waddchstr() - called: win=%p\n", win));

    return waddchnstr(win, ch, -1);
}

int mvaddchstr(int y, int x, const chtype *ch)
{
    PDC_LOG(("mvaddchstr() - called: y %d x %d\n", y, x));

    if (move(y, x) == ERR)
        return ERR;

    return waddchnstr(stdscr, ch, -1);
}

int mvaddchnstr(int y, int x, const chtype *ch, int n)
{
    PDC_LOG(("mvaddchnstr() - called: y %d x %d n %d\n", y, x, n));

    if (move(y, x) == ERR)
        return ERR;

    return waddchnstr(stdscr, ch, n);
}

int mvwaddchstr(WINDOW *win, int y, int x, const chtype *ch)
{
    PDC_LOG(("mvwaddchstr() - called:\n"));

    if (wmove(win, y, x) == ERR)
        return ERR;

    return waddchnstr(win, ch, -1);
}

int mvwaddchnstr(WINDOW *win, int y, int x, const chtype *ch, int n)
{
    PDC_LOG(("mvwaddchnstr() - called: y %d x %d n %d \n", y, x, n));

    if (wmove(win, y, x) == ERR)
        return ERR;

    return waddchnstr(win, ch, n);
}

#ifdef PDC_WIDE
int wadd_wchnstr(WINDOW *win, const cchar_t *wch, int n)
{
    PDC_LOG(("wadd_wchnstr() - called: win=%p n=%d\n", win, n));

    return waddchnstr(win, wch, n);
}

int add_wchstr(const cchar_t *wch)
{
    PDC_LOG(("add_wchstr() - called\n"));

    return wadd_wchnstr(stdscr, wch, -1);
}

int add_wchnstr(const cchar_t *wch, int n)
{
    PDC_LOG(("add_wchnstr() - called\n"));

    return wadd_wchnstr(stdscr, wch, n);
}

int wadd_wchstr(WINDOW *win, const cchar_t *wch)
{
    PDC_LOG(("wadd_wchstr() - called: win=%p\n", win));

    return wadd_wchnstr(win, wch, -1);
}

int mvadd_wchstr(int y, int x, const cchar_t *wch)
{
    PDC_LOG(("mvadd_wchstr() - called: y %d x %d\n", y, x));

    if (move(y, x) == ERR)
        return ERR;

    return wadd_wchnstr(stdscr, wch, -1);
}

int mvadd_wchnstr(int y, int x, const cchar_t *wch, int n)
{
    PDC_LOG(("mvadd_wchnstr() - called: y %d x %d n %d\n", y, x, n));

    if (move(y, x) == ERR)
        return ERR;

    return wadd_wchnstr(stdscr, wch, n);
}

int mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wch)
{
    PDC_LOG(("mvwadd_wchstr() - called:\n"));

    if (wmove(win, y, x) == ERR)
        return ERR;

    return wadd_wchnstr(win, wch, -1);
}

int mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wch, int n)
{
    PDC_LOG(("mvwadd_wchnstr() - called: y %d x %d n %d \n", y, x, n));

    if (wmove(win, y, x) == ERR)
        return ERR;

    return wadd_wchnstr(win, wch, n);
}
#endif
