xaizek / vifm-pdcurses (License: mostly public domain) (since 2019-03-20)
PDCurses 3.4 with vifm-specific patches applied (a couple were upstreamed)
<root> / pdcurses / addchstr.c (0eea85a74136a56aabdda28374a35b3abb470f64) (6,678B) (mode 100644) [raw]
/* 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
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/vifm-pdcurses

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/vifm-pdcurses

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master