check if capname is NULL for tparm() - sfeed_curses - sfeed curses UI (now part of sfeed, development is in sfeed)
 (HTM) git clone git://git.codemadness.org/sfeed_curses
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ea54b7b64b9a9c92108a2e1c680c426ca248e9cd
 (DIR) parent 8ebfb75d9ca26ce24a76aa3dc956182bd06f5b59
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sun, 25 Jul 2021 14:36:53 +0200
       
       check if capname is NULL for tparm()
       
       POSIX also does not specify NULL is allowed or not, so assume it isn't.
               https://pubs.opengroup.org/onlinepubs/7908799/xcurses/tigetflag.html
       
       This adds a wrapper to prevent NULL assertion in NetBSD curses/terminfo.
       
       netbsd-curses can use a diagnostic assert and aborts the program:
               https://github.com/oasislinux/netbsd-curses/blob/5b78297a1276a7d64c3be78d1e54251a1203a44a/lib/libterminfo/tparm.c
               http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/lib/libterminfo/tparm.c?rev=1.18&content-type=text/plain&only_with_tag=MAIN
       
       The current ncurses snapshot can show a trace call when the parameter is NULL,
       see the tparm_setup() function:
               https://github.com/ThomasDickey/ncurses-snapshots/blob/master/ncurses/tinfo/lib_tparm.c
       
       OpenBSD ncurses (older version), tparam_internal function does nothing if the parameter is NULL:
               http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libcurses/tinfo/lib_tparm.c?rev=1.9&content-type=text/plain
       
       Noticed on Oasis Linux which uses netbsd-curses and aborts when used in the
       terminal with the default $TERM=linux .
       
       Diffstat:
         M sfeed_curses.c                      |      32 ++++++++++++++++++++-----------
       
       1 file changed, 21 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/sfeed_curses.c b/sfeed_curses.c
       @@ -272,6 +272,16 @@ estrdup(const char *s)
                return p;
        }
        
       +/* wrapper for tparm which allows NULL parameter for str. */
       +char *
       +tparmnull(const char *str, long p1, long p2, long p3, long p4, long p5,
       +          long p6, long p7, long p8, long p9)
       +{
       +        if (!str)
       +                return NULL;
       +        return tparm(str, p1, p2, p3, p4, p5, p6, p7, p8, p9);
       +}
       +
        /* strcasestr() included for portability */
        #undef strcasestr
        char *
       @@ -508,7 +518,7 @@ updatetitle(void)
        void
        appmode(int on)
        {
       -        ttywrite(tparm(on ? enter_ca_mode : exit_ca_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +        ttywrite(tparmnull(on ? enter_ca_mode : exit_ca_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void
       @@ -521,13 +531,13 @@ mousemode(int on)
        void
        cursormode(int on)
        {
       -        ttywrite(tparm(on ? cursor_normal : cursor_invisible, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +        ttywrite(tparmnull(on ? cursor_normal : cursor_invisible, 0, 0, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void
        cursormove(int x, int y)
        {
       -        ttywrite(tparm(cursor_address, y, x, 0, 0, 0, 0, 0, 0, 0));
       +        ttywrite(tparmnull(cursor_address, y, x, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void
       @@ -535,7 +545,7 @@ cursorsave(void)
        {
                /* do not save the cursor if it won't be restored anyway */
                if (cursor_invisible)
       -                ttywrite(tparm(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(save_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void
       @@ -543,7 +553,7 @@ cursorrestore(void)
        {
                /* if the cursor cannot be hidden then move to a consistent position */
                if (cursor_invisible)
       -                ttywrite(tparm(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(restore_cursor, 0, 0, 0, 0, 0, 0, 0, 0, 0));
                else
                        cursormove(0, 0);
        }
       @@ -553,16 +563,16 @@ attrmode(int mode)
        {
                switch (mode) {
                case ATTR_RESET:
       -                ttywrite(tparm(exit_attribute_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(exit_attribute_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
                        break;
                case ATTR_BOLD_ON:
       -                ttywrite(tparm(enter_bold_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(enter_bold_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
                        break;
                case ATTR_FAINT_ON:
       -                ttywrite(tparm(enter_dim_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(enter_dim_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
                        break;
                case ATTR_REVERSE_ON:
       -                ttywrite(tparm(enter_reverse_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +                ttywrite(tparmnull(enter_reverse_mode, 0, 0, 0, 0, 0, 0, 0, 0, 0));
                        break;
                default:
                        break;
       @@ -572,13 +582,13 @@ attrmode(int mode)
        void
        cleareol(void)
        {
       -        ttywrite(tparm(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +        ttywrite(tparmnull(clr_eol, 0, 0, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void
        clearscreen(void)
        {
       -        ttywrite(tparm(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0));
       +        ttywrite(tparmnull(clear_screen, 0, 0, 0, 0, 0, 0, 0, 0, 0));
        }
        
        void