]> ncurses.scripts.mit.edu Git - ncurses.git/commitdiff
ncurses 6.4 - patch 20230408
authorThomas E. Dickey <dickey@invisible-island.net>
Sun, 9 Apr 2023 00:08:25 +0000 (00:08 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sun, 9 Apr 2023 00:08:25 +0000 (00:08 +0000)
+ document limitations of tparm, and error-returns in curs_terminfo.3x
+ document limitations of tgoto, and error-returns in curs_termcap.3x
+ add xterm+focus to alacritty+common (patch by Christian Duerr).
+ add "-v" option to tput, to show warnings.
> improve checks for malformed terminfo data (report/analysis by
  Jonathan Bar Or, Michael Pearse, Emanuele Cozzi).
  + make the parameter type/count checks in _nc_tiparm() more stringent
  + update tgoto() to account for _nc_tiparm() changes
  + add checks in tparm() and tiparm() for misuse of string parameters
  + add special cases in tput to handle extensions Cs/Ms parameters
  + ignore compiled-terminfo where the array sizes exceed the standard

38 files changed:
NEWS
VERSION
dist.mk
doc/html/man/adacurses6-config.1.html
doc/html/man/captoinfo.1m.html
doc/html/man/clear.1.html
doc/html/man/curs_termcap.3x.html
doc/html/man/curs_terminfo.3x.html
doc/html/man/form.3x.html
doc/html/man/infocmp.1m.html
doc/html/man/infotocap.1m.html
doc/html/man/menu.3x.html
doc/html/man/ncurses.3x.html
doc/html/man/ncurses6-config.1.html
doc/html/man/panel.3x.html
doc/html/man/tabs.1.html
doc/html/man/terminfo.5.html
doc/html/man/tic.1m.html
doc/html/man/toe.1m.html
doc/html/man/tput.1.html
doc/html/man/tset.1.html
man/curs_termcap.3x
man/curs_terminfo.3x
misc/terminfo.src
ncurses/tinfo/lib_tgoto.c
ncurses/tinfo/lib_tparm.c
ncurses/tinfo/read_entry.c
package/debian-mingw/changelog
package/debian-mingw64/changelog
package/debian/changelog
package/mingw-ncurses.nsi
package/mingw-ncurses.spec
package/ncurses.spec
package/ncursest.spec
progs/tic.c
progs/tparm_type.c
progs/tparm_type.h
progs/tput.c

diff --git a/NEWS b/NEWS
index f3b7e0c2d139149fe41c1ba77d389aafbcee8bd4..964fb6438cd746859654ac37ee72a3373c7ae753 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -26,7 +26,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: NEWS,v 1.3923 2023/04/01 23:29:48 tom Exp $
+-- $Id: NEWS,v 1.3929 2023/04/08 22:24:09 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -46,6 +46,19 @@ See the AUTHORS file for the corresponding full names.
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
+20230408
+       + document limitations of tparm, and error-returns in curs_terminfo.3x
+       + document limitations of tgoto, and error-returns in curs_termcap.3x
+       + add xterm+focus to alacritty+common (patch by Christian Duerr).
+       + add "-v" option to tput, to show warnings.
+       > improve checks for malformed terminfo data (report/analysis by
+         Jonathan Bar Or, Michael Pearse, Emanuele Cozzi).
+         + make the parameter type/count checks in _nc_tiparm() more stringent
+         + update tgoto() to account for _nc_tiparm() changes
+         + add checks in tparm() and tiparm() for misuse of string parameters
+         + add special cases in tput to handle extensions Cs/Ms parameters
+         + ignore compiled-terminfo where the array sizes exceed the standard
+
 20230401
        + modify experimental Windows driver to work with xterm mouse protocol.
        + remove DECCOLM+DECSCLM from foot (patch by Daniel Ekloef).
diff --git a/VERSION b/VERSION
index 34c01e4d7bdf85e895433d28ad783dc88cc7027d..78269eabbb1a3b1d69035c887253b340e48cc586 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-5:0:10 6.4     20230401
+5:0:10 6.4     20230408
diff --git a/dist.mk b/dist.mk
index d0c7cd8b86b25b9d011dfec40539fd90f744d725..99a74f8c597b266a3518146757f3e8c6d47f997a 100644 (file)
--- a/dist.mk
+++ b/dist.mk
@@ -26,7 +26,7 @@
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: dist.mk,v 1.1533 2023/04/01 11:05:21 tom Exp $
+# $Id: dist.mk,v 1.1534 2023/04/08 13:33:20 tom Exp $
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
@@ -38,7 +38,7 @@ SHELL = /bin/sh
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 6
 NCURSES_MINOR = 4
-NCURSES_PATCH = 20230401
+NCURSES_PATCH = 20230408
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index b699b0b5a1651854af7146f87af2a3a8cde6d0e1..fe563fe215140e8fe7f8b9d33e26dee2a4a196a7 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index d7c30af4314190e889bb861fad398ce68660e883..2c914951a5c5374f2727a156747756c227318eca 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
index 30ec20523d66ec5a5ea506148d2f6efc8f753daa..243d57ed356d45188aa8e3a04ac40d816594e0ad 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="tput.1.html">tput(1)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>, <STRONG>xterm(1)</STRONG>.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index 9cd555ec46d39dba477b9699b90ab5062698cac8..32699b3c48124e988b2c43782276f74236236c0f 100644 (file)
@@ -1,6 +1,6 @@
 <!--
   ****************************************************************************
-  * Copyright 2018-2022,2022 Thomas E. Dickey                                *
+  * Copyright 2018-2022,2023 Thomas E. Dickey                                *
   * Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
   *                                                                          *
   * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -27,7 +27,7 @@
   * sale, use or other dealings in this Software without prior written       *
   * authorization.                                                           *
   ****************************************************************************
-  * @Id: curs_termcap.3x,v 1.56 2022/02/12 20:05:11 tom Exp @
+  * @Id: curs_termcap.3x,v 1.57 2023/04/08 21:43:01 tom Exp @
 -->
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
 <HTML>
            first parameter is merely a placeholder.
 
        <STRONG>o</STRONG>   Normally the ncurses library is compiled with terminfo support.  In
-           that case, <STRONG>tgoto</STRONG> uses <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> (a more capable formatter).
+           that  case, <STRONG>tgoto</STRONG> uses an internal version of <STRONG><A HREF="curs_terminfo.3x.html">tparm(3x)</A></STRONG> (a more ca-
+           pable formatter).
 
-           However,  <STRONG>tparm</STRONG>  is not a <EM>termcap</EM> feature, and portable <EM>termcap</EM> ap-
+           With terminfo support, <STRONG>tgoto</STRONG> is able to use some  of  the  terminfo
+           features,  but  not all.  In particular, it allows only numeric pa-
+           rameters; <STRONG>tparm</STRONG> supports string parameters.
+
+           However, <STRONG>tparm</STRONG> is not a <EM>termcap</EM> feature, and portable  <EM>termcap</EM>  ap-
            plications should not rely upon its availability.
 
-       The <STRONG>tputs</STRONG> routine is described on the  <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>  manual  page.
+       The  <STRONG>tputs</STRONG>  routine  is described on the <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG> manual page.
        It can retrieve capabilities by either termcap or terminfo name.
 
 
 </PRE><H3><a name="h3-Global-Variables">Global Variables</a></H3><PRE>
-       The  variables <STRONG>PC</STRONG>, <STRONG>UP</STRONG> and <STRONG>BC</STRONG> are set by <STRONG>tgetent</STRONG> to the terminfo entry's
+       The variables <STRONG>PC</STRONG>, <STRONG>UP</STRONG> and <STRONG>BC</STRONG> are set by <STRONG>tgetent</STRONG> to the terminfo  entry's
        data for <STRONG>pad_char</STRONG>, <STRONG>cursor_up</STRONG> and <STRONG>backspace_if_not_bs</STRONG>, respectively.  <STRONG>UP</STRONG>
-       is  not used by ncurses.  <STRONG>PC</STRONG> is used in the <STRONG>tdelay_output</STRONG> function.  <STRONG>BC</STRONG>
-       is used in the <STRONG>tgoto</STRONG> emulation.  The variable <STRONG>ospeed</STRONG> is set by  ncurses
+       is not used by ncurses.  <STRONG>PC</STRONG> is used in the <STRONG>tdelay_output</STRONG> function.   <STRONG>BC</STRONG>
+       is  used in the <STRONG>tgoto</STRONG> emulation.  The variable <STRONG>ospeed</STRONG> is set by ncurses
        in a system-specific coding to reflect the terminal speed.
 
 
 </PRE><H3><a name="h3-Releasing-Memory">Releasing Memory</a></H3><PRE>
-       The  termcap  functions  provide  no  means for freeing memory, because
-       legacy termcap implementations used only the buffer areas  provided  by
-       the  caller  via <STRONG>tgetent</STRONG> and <STRONG>tgetstr</STRONG>.  Those buffers are unused in ter-
+       The termcap functions provide no  means  for  freeing  memory,  because
+       legacy  termcap  implementations used only the buffer areas provided by
+       the caller via <STRONG>tgetent</STRONG> and <STRONG>tgetstr</STRONG>.  Those buffers are unused  in  ter-
        minfo.
 
        On the other hand, terminfo allocates memory.  It uses <STRONG>setupterm</STRONG> to re-
             <STRONG>del_curterm(cur_term);</STRONG>
 
 
-       to free this memory, but  there  is  an  additional  complication  with
-       ncurses.   It uses a fixed-size <EM>pool</EM> of storage locations, one per set-
-       ting of the <STRONG>TERM</STRONG> variable when <STRONG>tgetent</STRONG> is called.  The  <STRONG>screen(1)</STRONG>  pro-
+       to  free  this  memory,  but  there  is an additional complication with
+       ncurses.  It uses a fixed-size <EM>pool</EM> of storage locations, one per  set-
+       ting  of  the <STRONG>TERM</STRONG> variable when <STRONG>tgetent</STRONG> is called.  The <STRONG>screen(1)</STRONG> pro-
        gram relies upon this arrangement, to improve its performance.
 
-       An  application  which  uses only the low-level termcap functions could
+       An application which uses only the low-level  termcap  functions  could
        free the memory using <STRONG>del_curterm</STRONG>, because the pool is freed using oth-
        er functions (see <STRONG><A HREF="curs_memleaks.3x.html">curs_memleaks(3x)</A></STRONG>).
 
 
 </PRE><H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
-       Except  where  explicitly noted, routines that return an integer return
-       <STRONG>ERR</STRONG> upon failure and <STRONG>OK</STRONG> (SVr4 only specifies "an  integer  value  other
+       Except where explicitly noted, routines that return an  integer  return
+       <STRONG>ERR</STRONG>  upon  failure  and <STRONG>OK</STRONG> (SVr4 only specifies "an integer value other
        than <STRONG>ERR</STRONG>") upon successful completion.
 
        Routines that return pointers return <STRONG>NULL</STRONG> on error.
 
+       A few special cases apply:
+
+       <STRONG>o</STRONG>   If the terminal database has not been initialized, these return  an
+           error.
+
+       <STRONG>o</STRONG>   The  calls  with  a  string  parameter  (<STRONG>tgoto</STRONG>, <STRONG>tputs</STRONG>) check if the
+           string is null, or cancelled.  Those return an error.
+
+       <STRONG>o</STRONG>   A call to <STRONG>tgoto</STRONG> using a capability with string parameters is an er-
+           ror.
+
+       <STRONG>o</STRONG>   A call to <STRONG>tgoto</STRONG> using a capability with no parameters, or more than
+           two is an error.
+
 
 </PRE><H2><a name="h2-BUGS">BUGS</a></H2><PRE>
-       If  you  call <STRONG>tgetstr</STRONG> to fetch <STRONG>ca</STRONG> or any other parameterized string, be
-       aware that it will be returned in terminfo notation, not the older  and
+       If you call <STRONG>tgetstr</STRONG> to fetch <STRONG>ca</STRONG> or any other parameterized  string,  be
+       aware  that it will be returned in terminfo notation, not the older and
        not-quite-compatible termcap notation.  This will not cause problems if
-       all you do with it is call <STRONG>tgoto</STRONG> or <STRONG>tparm</STRONG>, which both expand  terminfo-
-       style  strings as terminfo.  (The <STRONG>tgoto</STRONG> function, if configured to sup-
-       port termcap, will check if the  string  is  indeed  terminfo-style  by
-       looking  for  "%p"  parameters or "$&lt;..&gt;" delays, and invoke a termcap-
+       all  you do with it is call <STRONG>tgoto</STRONG> or <STRONG>tparm</STRONG>, which both expand terminfo-
+       style strings as terminfo.  (The <STRONG>tgoto</STRONG> function, if configured to  sup-
+       port  termcap,  will  check  if  the string is indeed terminfo-style by
+       looking for "%p" parameters or "$&lt;..&gt;" delays, and  invoke  a  termcap-
        style parser if the string does not appear to be terminfo).
 
-       Because terminfo conventions for representing padding in  string  capa-
+       Because  terminfo  conventions for representing padding in string capa-
        bilities differ from termcap's, users can be surprised:
 
        <STRONG>o</STRONG>   <STRONG>tputs("50")</STRONG> in a terminfo system will put out a literal "50" rather
            than busy-waiting for 50 milliseconds.
 
-       <STRONG>o</STRONG>   However, if ncurses is configured to support termcap, it  may  also
+       <STRONG>o</STRONG>   However,  if  ncurses is configured to support termcap, it may also
            have been configured to support the BSD-style padding.
 
            In that case, <STRONG>tputs</STRONG> inspects strings passed to it, looking for dig-
            <STRONG>tputs("50")</STRONG> in a termcap system may wait for 50 milliseconds rather
            than put out a literal "50"
 
-       Note  that termcap has nothing analogous to terminfo's <STRONG>sgr</STRONG> string.  One
-       consequence of this is that termcap applications  assume  <STRONG>me</STRONG>  (terminfo
-       <STRONG>sgr0</STRONG>)  does not reset the alternate character set.  This implementation
+       Note that termcap has nothing analogous to terminfo's <STRONG>sgr</STRONG> string.   One
+       consequence  of  this  is that termcap applications assume <STRONG>me</STRONG> (terminfo
+       <STRONG>sgr0</STRONG>) does not reset the alternate character set.  This  implementation
        checks for, and modifies the data shown to the termcap interface to ac-
        commodate termcap's limitation in this respect.
 
 </PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
 
 </PRE><H3><a name="h3-Standards">Standards</a></H3><PRE>
-       These  functions  are  provided for supporting legacy applications, and
+       These functions are provided for supporting  legacy  applications,  and
        should not be used in new programs:
 
        <STRONG>o</STRONG>   The XSI Curses standard, Issue 4 describes these functions.  Howev-
-           er,  they  are  marked TO BE WITHDRAWN and may be removed in future
+           er, they are marked TO BE WITHDRAWN and may be  removed  in  future
            versions.
 
        <STRONG>o</STRONG>   X/Open Curses, Issue 5 (December 2007) marked the termcap interface
            (along with <STRONG>vwprintw</STRONG> and <STRONG>vwscanw</STRONG>) as withdrawn.
 
-       Neither  the  XSI Curses standard nor the SVr4 man pages documented the
-       return values of <STRONG>tgetent</STRONG> correctly, though all three were in  fact  re-
-       turned  ever  since SVr1.  In particular, an omission in the XSI Curses
-       documentation has been misinterpreted to mean that <STRONG>tgetent</STRONG>  returns  <STRONG>OK</STRONG>
-       or  <STRONG>ERR</STRONG>.  Because the purpose of these functions is to provide compati-
-       bility with the <EM>termcap</EM> library, that is a defect in XCurses, Issue  4,
+       Neither the XSI Curses standard nor the SVr4 man pages  documented  the
+       return  values  of <STRONG>tgetent</STRONG> correctly, though all three were in fact re-
+       turned ever since SVr1.  In particular, an omission in the  XSI  Curses
+       documentation  has  been misinterpreted to mean that <STRONG>tgetent</STRONG> returns <STRONG>OK</STRONG>
+       or <STRONG>ERR</STRONG>.  Because the purpose of these functions is to provide  compati-
+       bility  with the <EM>termcap</EM> library, that is a defect in XCurses, Issue 4,
        Version 2 rather than in ncurses.
 
 
        External variables are provided for support of certain termcap applica-
        tions.  However, termcap applications' use of those variables is poorly
        documented, e.g., not distinguishing between input and output.  In par-
-       ticular, some applications are reported to declare  and/or  modify  <STRONG>os-</STRONG>
+       ticular,  some  applications  are reported to declare and/or modify <STRONG>os-</STRONG>
        <STRONG>peed</STRONG>.
 
-       The  comment that only the first two characters of the <STRONG>id</STRONG> parameter are
+       The comment that only the first two characters of the <STRONG>id</STRONG> parameter  are
        used escapes many application developers.  The original BSD 4.2 termcap
        library (and historical relics thereof) did not require a trailing null
-       NUL on the parameter name passed  to  <STRONG>tgetstr</STRONG>,  <STRONG>tgetnum</STRONG>  and  <STRONG>tgetflag</STRONG>.
-       Some  applications  assume  that the termcap interface does not require
+       NUL  on  the  parameter  name  passed to <STRONG>tgetstr</STRONG>, <STRONG>tgetnum</STRONG> and <STRONG>tgetflag</STRONG>.
+       Some applications assume that the termcap interface  does  not  require
        the trailing NUL for the parameter name.  Taking into account these is-
        sues:
 
-       <STRONG>o</STRONG>   As  a  special  case,  <STRONG>tgetflag</STRONG>  matched against a single-character
-           identifier provided that was at the end of  the  terminal  descrip-
+       <STRONG>o</STRONG>   As a special case,  <STRONG>tgetflag</STRONG>  matched  against  a  single-character
+           identifier  provided  that  was at the end of the terminal descrip-
            tion.  You should not rely upon this behavior in portable programs.
-           This implementation disallows matches against single-character  ca-
+           This  implementation disallows matches against single-character ca-
            pability names.
 
-       <STRONG>o</STRONG>   This  implementation  disallows  matches  by  the termcap interface
+       <STRONG>o</STRONG>   This implementation disallows  matches  by  the  termcap  interface
            against extended capability names which are longer than two charac-
            ters.
 
        The BSD termcap function <STRONG>tgetent</STRONG> returns the text of a termcap entry in
-       the buffer passed as an argument.  This library  (like  other  terminfo
+       the  buffer  passed  as an argument.  This library (like other terminfo
        implementations) does not store terminal descriptions as text.  It sets
        the buffer contents to a null-terminated string.
 
 
 </PRE><H3><a name="h3-Other-Compatibility">Other Compatibility</a></H3><PRE>
-       This library includes a termcap.h header, for compatibility with  other
-       implementations.   But  the header is rarely used because the other im-
+       This  library includes a termcap.h header, for compatibility with other
+       implementations.  But the header is rarely used because the  other  im-
        plementations are not strictly compatible.
 
        The original BSD termcap (through 4.3BSD) had no header file which gave
        function prototypes, because that was a feature of ANSI C.  BSD termcap
-       was written several years before C was  standardized.   However,  there
+       was  written  several  years before C was standardized.  However, there
        were two different termcap.h header files in the BSD sources:
 
-       <STRONG>o</STRONG>   One  was used internally by the <STRONG>jove</STRONG> editor in 2BSD through 4.4BSD.
+       <STRONG>o</STRONG>   One was used internally by the <STRONG>jove</STRONG> editor in 2BSD through  4.4BSD.
            It defined global symbols for the termcap variables which it used.
 
-       <STRONG>o</STRONG>   The other appeared in 4.4BSD Lite Release 2 (mid-1993) as  part  of
+       <STRONG>o</STRONG>   The  other  appeared in 4.4BSD Lite Release 2 (mid-1993) as part of
            <EM>libedit</EM> (also known as the <EM>editline</EM> library).  The CSRG source his-
-           tory shows that this was added in  mid-1992.   The  <EM>libedit</EM>  header
-           file  was used internally, as a convenience for compiling the <EM>edit-</EM>
+           tory  shows  that  this  was added in mid-1992.  The <EM>libedit</EM> header
+           file was used internally, as a convenience for compiling the  <EM>edit-</EM>
            <EM>line</EM> library.  It declared function prototypes, but no global vari-
            ables.
 
-       The  header  file from <EM>libedit</EM> was added to NetBSD's termcap library in
+       The header file from <EM>libedit</EM> was added to NetBSD's termcap  library  in
        mid-1994.
 
-       Meanwhile, GNU termcap was under development, starting  in  1990.   The
-       first  release  (termcap 1.0) in 1991 included a termcap.h header.  The
-       second release (termcap 1.1) in September 1992 modified the  header  to
+       Meanwhile,  GNU  termcap  was under development, starting in 1990.  The
+       first release (termcap 1.0) in 1991 included a termcap.h  header.   The
+       second  release  (termcap 1.1) in September 1992 modified the header to
        use <STRONG>const</STRONG> for the function prototypes in the header where one would ex-
-       pect the parameters to be read-only.  This was a difference versus  the
-       original  BSD  termcap.   The prototype for <STRONG>tputs</STRONG> also differed, but in
+       pect  the parameters to be read-only.  This was a difference versus the
+       original BSD termcap.  The prototype for <STRONG>tputs</STRONG> also  differed,  but  in
        that instance, it was <EM>libedit</EM> which differed from BSD termcap.
 
        A copy of GNU termcap 1.3 was bundled with <EM>bash</EM> in mid-1993, to support
        the <STRONG>readline(3)</STRONG> library.
 
-       A  termcap.h  file was provided in ncurses 1.8.1 (November 1993).  That
+       A termcap.h file was provided in ncurses 1.8.1 (November  1993).   That
        reflected influence by <STRONG>emacs(1)</STRONG> (rather than <STRONG>jove(1)</STRONG>) and GNU termcap:
 
        <STRONG>o</STRONG>   it provided declarations for a few global symbols used by <STRONG>emacs</STRONG>
        <STRONG>o</STRONG>   a prototype for <STRONG>tparam</STRONG> (a GNU termcap feature) was provided.
 
        Later (in mid-1996) the <STRONG>tparam</STRONG> function was removed from ncurses.  As a
-       result,  there are differences between any of the four implementations,
-       which must be taken into account by programs which can  work  with  all
+       result, there are differences between any of the four  implementations,
+       which  must  be  taken into account by programs which can work with all
        termcap library interfaces.
 
 
index c50d7db335adb200641134c57006511622c7df21..480cafceb690019dfbb43bd564b90a33cc5948e5 100644 (file)
@@ -1,6 +1,6 @@
 <!--
   ****************************************************************************
-  * Copyright 2018-2022,2022 Thomas E. Dickey                                *
+  * Copyright 2018-2022,2023 Thomas E. Dickey                                *
   * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
   *                                                                          *
   * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -27,7 +27,7 @@
   * sale, use or other dealings in this Software without prior written       *
   * authorization.                                                           *
   ****************************************************************************
-  * @Id: curs_terminfo.3x,v 1.82 2022/06/04 22:47:05 tom Exp @
+  * @Id: curs_terminfo.3x,v 1.83 2023/04/08 22:54:21 tom Exp @
   * ***************************************************************************
   * ***************************************************************************
   * ***************************************************************************
@@ -83,6 +83,9 @@
        <STRONG>int</STRONG> <STRONG>restartterm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>filedes</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>errret</EM><STRONG>);</STRONG>
 
        <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+            <EM>or</EM>
+       <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>long</STRONG> <EM>p1</EM> <EM>...</EM> <STRONG>long</STRONG> <EM>p9</EM><STRONG>);</STRONG>
+
        <STRONG>int</STRONG> <STRONG>tputs(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>affcnt</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>putc</EM><STRONG>)(int));</STRONG>
        <STRONG>int</STRONG> <STRONG>putp(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
 
                the initial windows (stdscr, curscr, newscr).  Other error con-
                ditions are documented above.
 
+          <STRONG>tparm</STRONG>
+               returns a null if the capability would require  unexpected  pa-
+               rameters,  e.g., too many, too few, or incorrect types (strings
+               where integers are expected, or vice versa).
+
           <STRONG>tputs</STRONG>
                returns an error if the string parameter is null.  It does  not
                detect  I/O errors: X/Open states that <STRONG>tputs</STRONG> ignores the return
        <STRONG>Function</STRONG>    <STRONG>Description</STRONG>
        -------------------------------------------
        tigetflag   get boolean entry for given <EM>id</EM>
-
        tigetnum    get numeric entry for given <EM>id</EM>
        tigetstr    get string entry for given <EM>id</EM>
 
            In  response  to review comments by Thomas E. Dickey, X/Open Curses
            Issue 7 proposed the <STRONG>tiparm</STRONG> function in mid-2009.
 
+           While <STRONG>tiparm</STRONG> is always provided in ncurses, the older form is  only
+           available  as  a build-time configuration option.  If not specially
+           configured, <STRONG>tparm</STRONG> is the same as <STRONG>tiparm</STRONG>.
+
+       Both forms of <STRONG>tparm</STRONG> have drawbacks:
+
+       <STRONG>o</STRONG>   Most of the calls to <STRONG>tparm</STRONG> use only one or two parameters.  Passing
+           nine on each call is awkward.
+
+           Using  <STRONG>long</STRONG>  for the numeric parameter type is a workaround to make
+           the parameter use the same amount of stack as a pointer.  That  ap-
+           proach  dates  back  to  the  mid-1980s,  before C was standarized.
+           Since then, there is a standard (and pointers are not  required  to
+           fit in a long).
+
+       <STRONG>o</STRONG>   Providing  the  right  number of parameters for a variadic function
+           such as <STRONG>tiparm</STRONG> can be a problem, in particular for  string  parame-
+           ters.  However, only a few terminfo capabilities use string parame-
+           ters (e.g., the ones used for programmable function keys).
+
+           The ncurses library checks usage of these capabilities, and returns
+           an  error  if  the capability mishandles string parameters.  But it
+           cannot check if a calling program provides  strings  in  the  right
+           places for the <STRONG>tparm</STRONG> calls.
+
+           The  <STRONG><A HREF="tput.3x.html">tput(3x)</A></STRONG>  program  checks its use of these capabilities with a
+           table, so that it calls <STRONG>tparm</STRONG> correctly.
+
 
 </PRE><H3><a name="h3-Special-TERM-treatment">Special TERM treatment</a></H3><PRE>
        If configured to use the terminal-driver, e.g., for the MinGW port,
index baaadbd255a4a514a693914245f8765eb1935ace..9551b458eea941064b4c8fec5e2b48cb782751a4 100644 (file)
        <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> and related pages whose names  begin  "form_"  for  detailed
        descriptions of the entry points.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index f43fda340f4927d0fbc081583ad13c826bdef10b..bb5957a5d5bffc92b5850db864805b0cf77b8ae3 100644 (file)
 
        https://invisible-island.net/ncurses/tctest.html
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
index 37a5797a7ee7da64244d1e47cc065c0f4e252402..1ab52071244ea9e0c6ce382cee84cdf89093df1d 100644 (file)
@@ -91,7 +91,7 @@
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
index 8ffaa3dbf01c74c5c5e0a3c7e32881843fbf46ff..8f4641bf90d238268485906977e62f849ecb98ef 100644 (file)
        <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG> and related pages whose names  begin  "menu_"  for  detailed
        descriptions of the entry points.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index 8cfe515be4a520e25b876f9a5a0a8bbe674b3dc5..9cf27bf5410fe46f1af0d5c88a90623f85cc1965 100644 (file)
@@ -60,7 +60,7 @@
        method of updating  character  screens  with  reasonable  optimization.
        This  implementation  is  "new  curses"  (ncurses)  and is the approved
        replacement for 4.4BSD classic curses,  which  has  been  discontinued.
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
        The  <STRONG>ncurses</STRONG>  library emulates the curses library of System V Release 4
        UNIX, and XPG4 (X/Open Portability Guide) curses  (also  known  as  XSI
index 27bfb037c716cdf098dfc5c1a3645331e881af40..9cd27f50005d940793cc23c3bf8bf4edc0599346 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index a9e1976a3d851525ee199c0c11259bfa781a874f..0fd84723df9bc30616f6ccdd45b35c0566e29275 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>,
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
index 5eb352470e04a888965a62387ab2ac0eaa3be0f6..228e17d8c0e22132f154b5120c308a0a25ff6ebf 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>, <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>, <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index d5ad0da33888074012406ff9d5dc437595b7ee72..88986bf796b631f10ccb8616e4d3ee99e95d51a8 100644 (file)
        have, by specifying how to perform screen operations, and by specifying
        padding requirements and initialization sequences.
 
-       This manual describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This manual describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H3><a name="h3-Terminfo-Entry-Syntax">Terminfo Entry Syntax</a></H3><PRE>
index 0fa0e3cb3455855bd3a5d2f62022c7025f88c3a7..6c12f037079f80798861685fe885f832aa1a4740 100644 (file)
        <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>,   <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>,   <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>,   <STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG>,   <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,
        <STRONG><A HREF="term.5.html">term(5)</A></STRONG>.  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.  <STRONG><A HREF="user_caps.5.html">user_caps(5)</A></STRONG>.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 </PRE><H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
index 430675c5c9e792f43b0b16aabd42017c7148f6b8..3885962400b05e8faffddc95bea7e7664c24c19f 100644 (file)
        <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>,   <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>,   <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>,   <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>,   <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>,
        <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index c4916439bbc199123b0d377d763952226ebc27d0..ee231640860100b76d9d660c13bf32bd22c2b3ec 100644 (file)
 </PRE><H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
        <STRONG><A HREF="clear.1.html">clear(1)</A></STRONG>, <STRONG>stty(1)</STRONG>, <STRONG><A HREF="tabs.1.html">tabs(1)</A></STRONG>, <STRONG><A HREF="tset.1.html">tset(1)</A></STRONG>, <STRONG><A HREF="curs_termcap.3x.html">curs_termcap(3x)</A></STRONG>, <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index efb6a18984bf724ded11b01127f56a2099bddeea..19396d91b8616e47fa8a91b639b1008bef746386 100644 (file)
        <STRONG>csh(1)</STRONG>,   <STRONG>sh(1)</STRONG>,   <STRONG>stty(1)</STRONG>,   <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>,  <STRONG>tty(4)</STRONG>,  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>,
        <STRONG>ttys(5)</STRONG>, <STRONG>environ(7)</STRONG>
 
-       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230311).
+       This describes <STRONG>ncurses</STRONG> version 6.4 (patch 20230408).
 
 
 
index e073d940cdd29003d908423090e2339a3653ea22..1630658d191db9c4ebb4f0f651c3e22112f60683 100644 (file)
@@ -1,5 +1,5 @@
 .\"***************************************************************************
-.\" Copyright 2018-2022,2022 Thomas E. Dickey                                *
+.\" Copyright 2018-2022,2023 Thomas E. Dickey                                *
 .\" Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
 .\"                                                                          *
 .\" Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -27,7 +27,7 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: curs_termcap.3x,v 1.56 2022/02/12 20:05:11 tom Exp $
+.\" $Id: curs_termcap.3x,v 1.57 2023/04/08 21:43:01 tom Exp $
 .TH curs_termcap 3X ""
 .ie \n(.g .ds `` \(lq
 .el       .ds `` ``
@@ -173,7 +173,13 @@ It does this also for calls requiring only a single parameter.
 In that case, the first parameter is merely a placeholder.
 .bP
 Normally the ncurses library is compiled with terminfo support.
-In that case, \fBtgoto\fP uses \fBtparm\fP(3X) (a more capable formatter).
+In that case, \fBtgoto\fP uses an internal version of
+\fBtparm\fP(3X) (a more capable formatter).
+.IP
+With terminfo support, \fBtgoto\fP is able to use some of the terminfo
+features, but not all.
+In particular, it allows only numeric parameters;
+\fBtparm\fP supports string parameters.
 .IP
 However, \fBtparm\fP is not a \fItermcap\fP feature,
 and portable \fItermcap\fP applications should not rely upon its availability.
@@ -229,6 +235,20 @@ routines that return an integer return \fBERR\fP upon failure and \fBOK\fP
 completion.
 .PP
 Routines that return pointers return \fBNULL\fP on error.
+.PP
+A few special cases apply:
+.bP
+If the terminal database has not been initialized,
+these return an error.
+.bP
+The calls with a string parameter (\fBtgoto\fP, \fBtputs\fP)
+check if the string is null, or cancelled.
+Those return an error.
+.bP
+A call to \fBtgoto\fP using a capability with string parameters is an error.
+.bP
+A call to \fBtgoto\fP using a capability with no parameters,
+or more than two is an error.
 .SH BUGS
 If you call \fBtgetstr\fP to fetch \fBca\fP or any other parameterized string,
 be aware that it will be returned in terminfo notation, not the older and
index 00ae1349db0ad0a8cec0b1c1064a852e20178675..5ea01ee653ec8fbbc9f0801c1cc12b4b515eb822 100644 (file)
@@ -1,5 +1,5 @@
 .\"***************************************************************************
-.\" Copyright 2018-2022,2022 Thomas E. Dickey                                *
+.\" Copyright 2018-2022,2023 Thomas E. Dickey                                *
 .\" Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
 .\"                                                                          *
 .\" Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -27,7 +27,7 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: curs_terminfo.3x,v 1.82 2022/06/04 22:47:05 tom Exp $
+.\" $Id: curs_terminfo.3x,v 1.83 2023/04/08 22:54:21 tom Exp $
 .TH curs_terminfo 3X ""
 .ie \n(.g .ds `` \(lq
 .el       .ds `` ``
 .sp
 \fBchar *tparm(const char *\fIstr\fB, ...);\fR
 .br
+       \fIor\fP
+.br
+\fBchar *tparm(const char *\fIstr\fB, long \fIp1 ... \fBlong \fIp9\fB);\fR
+.sp
 \fBint tputs(const char *\fIstr\fB, int \fIaffcnt\fB, int (*\fIputc\fB)(int));\fR
 .br
 \fBint putp(const char *\fIstr\fB);\fR
@@ -463,6 +467,11 @@ if it cannot allocate enough memory, or
 create the initial windows (stdscr, curscr, newscr).
 Other error conditions are documented above.
 .TP 5
+\fBtparm\fP
+returns a null if the capability would require unexpected parameters,
+e.g., too many, too few, or incorrect types
+(strings where integers are expected, or vice versa).
+.TP 5
 \fBtputs\fP
 returns an error if the string parameter is null.
 It does not detect I/O errors:
@@ -663,6 +672,34 @@ zeroes are fine for this purpose.
 .IP
 In response to review comments by Thomas E. Dickey,
 X/Open Curses Issue 7 proposed the \fBtiparm\fP function in mid-2009.
+.IP
+While \fBtiparm\fP is always provided in ncurses,
+the older form is only available as a build-time configuration option.
+If not specially configured, \fBtparm\fP is the same as \fBtiparm\fP.
+.PP
+Both forms of \fBtparm\fP have drawbacks:
+.bP
+Most of the calls to \fBtparm\fP use only one or two parameters.
+Passing nine on each call is awkward.
+.IP
+Using \fBlong\fP for the numeric parameter type is a workaround
+to make the parameter use the same amount of stack as a pointer.
+That approach dates back to the mid-1980s, before C was standarized.
+Since then, there is a standard
+(and pointers are not required to fit in a long).
+.bP
+Providing the right number of parameters for a variadic function
+such as \fBtiparm\fP can be a problem, in particular for string parameters.
+However, only a few terminfo capabilities use string parameters
+(e.g., the ones used for programmable function keys).
+.IP
+The ncurses library checks usage of these capabilities,
+and returns an error if the capability mishandles string parameters.
+But it cannot check if a calling program provides strings in the right
+places for the \fBtparm\fP calls.
+.IP
+The \fBtput\fR(3X) program checks its use of these capabilities with a table,
+so that it calls \fBtparm\fP correctly.
 .SS Special TERM treatment
 .PP
 If configured to use the terminal-driver,
index 61b24111fdb5c36c6919d2baea4057c0ef3603b2..e00a7f6b3c718029eb5fd6f12c65823a43e77591 100644 (file)
@@ -6,8 +6,8 @@
 # Report bugs and new terminal descriptions to
 #      bug-ncurses@gnu.org
 #
-#      $Revision: 1.1056 $
-#      $Date: 2023/04/01 23:24:35 $
+#      $Revision: 1.1057 $
+#      $Date: 2023/04/08 21:08:00 $
 #
 # The original header is preserved below for reference.  It is noted that there
 # is a "newer" version which differs in some cosmetic details (but actually
@@ -7791,7 +7791,7 @@ alacritty+common|base fragment for alacritty,
        use=xterm-basic, use=xterm+app, use=ansi+rep,
        use=xterm+tmux, use=ecma+strikeout, use=xterm+sl-twm,
        use=ecma+italics, use=xterm+pce2, use=xterm+pcc2,
-       use=xterm+pcf2, use=bracketed+paste,
+       use=xterm+pcf2, use=bracketed+paste, use=xterm+focus,
 
 #### Kitty
 # https://github.com/kovidgoyal/kitty
@@ -27807,4 +27807,7 @@ v3220|LANPAR Vision II model 3220/3221/3222,
 # 2023-04-01
 #      + remove DECCOLM+DECSCLM from foot (patch by Daniel Ekloef).
 #
+# 2023-04-08
+#      + add xterm+focus to alacritty+common (patch by Christian Duerr).
+#
 ######## SHANTIH!  SHANTIH!  SHANTIH!
index 9cf5e100ce87ff7abd3c90b0bdc15084e54b2f35..084a322fe95c8a05fdb26dd0d272d2b2c6f2cc62 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2018-2019,2020 Thomas E. Dickey                                *
+ * Copyright 2018-2020,2023 Thomas E. Dickey                                *
  * Copyright 2000-2008,2012 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -36,7 +36,7 @@
 #include <ctype.h>
 #include <termcap.h>
 
-MODULE_ID("$Id: lib_tgoto.c,v 1.21 2020/05/27 23:55:56 tom Exp $")
+MODULE_ID("$Id: lib_tgoto.c,v 1.22 2023/04/08 13:48:58 tom Exp $")
 
 #if !PURE_TERMINFO
 static bool
@@ -207,6 +207,14 @@ tgoto(const char *string, int x, int y)
        result = tgoto_internal(string, x, y);
     else
 #endif
-       result = TIPARM_2(string, y, x);
+    if ((result = TIPARM_2(string, y, x)) == NULL) {
+       /*
+        * Because termcap did not provide a more general solution such as
+        * tparm(), it was necessary to handle single-parameter capabilities
+        * using tgoto().  The internal _nc_tiparm() function returns a NULL
+        * for that case; retry for the single-parameter case.
+        */
+       result = TIPARM_1(string, y);
+    }
     returnPtr(result);
 }
index d9bdfd8faf06ef6860523f6f61d08762dd6d85aa..8988a3d4582a514167d6f64778e7f07a259fe00b 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 2018-2021,2023 Thomas E. Dickey                                *
  * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -53,7 +53,7 @@
 #include <ctype.h>
 #include <tic.h>
 
-MODULE_ID("$Id: lib_tparm.c,v 1.137 2021/11/20 23:29:15 tom Exp $")
+MODULE_ID("$Id: lib_tparm.c,v 1.141 2023/04/08 18:24:18 tom Exp $")
 
 /*
  *     char *
@@ -1086,6 +1086,64 @@ tparam_internal(TPARM_STATE *tps, const char *string, TPARM_DATA *data)
     return (TPS(out_buff));
 }
 
+#ifdef CUR
+/*
+ * Only a few standard capabilities accept string parameters.  The others that
+ * are parameterized accept only numeric parameters.
+ */
+static bool
+check_string_caps(TPARM_DATA *data, const char *string)
+{
+    bool result = FALSE;
+
+#define CHECK_CAP(name) (VALID_STRING(name) && !strcmp(name, string))
+
+    /*
+     * Disallow string parameters unless we can check them against a terminal
+     * description.
+     */
+    if (cur_term != NULL) {
+       int want_type = 0;
+
+       if (CHECK_CAP(pkey_key))
+           want_type = 2;      /* function key #1, type string #2 */
+       else if (CHECK_CAP(pkey_local))
+           want_type = 2;      /* function key #1, execute string #2 */
+       else if (CHECK_CAP(pkey_xmit))
+           want_type = 2;      /* function key #1, transmit string #2 */
+       else if (CHECK_CAP(plab_norm))
+           want_type = 2;      /* label #1, show string #2 */
+       else if (CHECK_CAP(pkey_plab))
+           want_type = 6;      /* function key #1, type string #2, show string #3 */
+#if NCURSES_XNAMES
+       else {
+           char *check;
+
+           check = tigetstr("Cs");
+           if (CHECK_CAP(check))
+               want_type = 1;  /* style #1 */
+
+           check = tigetstr("Ms");
+           if (CHECK_CAP(check))
+               want_type = 3;  /* storage unit #1, content #2 */
+       }
+#endif
+
+       if (want_type == data->tparm_type) {
+           result = TRUE;
+       } else {
+           T(("unexpected string-parameter"));
+       }
+    }
+    return result;
+}
+
+#define ValidCap() (myData.tparm_type == 0 || \
+                   check_string_caps(&myData, string))
+#else
+#define ValidCap() 1
+#endif
+
 #if NCURSES_TPARM_VARARGS
 
 NCURSES_EXPORT(char *)
@@ -1100,7 +1158,7 @@ tparm(const char *string, ...)
     tps->tname = "tparm";
 #endif /* TRACE */
 
-    if (tparm_setup(cur_term, string, &myData) == OK) {
+    if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
        va_list ap;
 
        va_start(ap, string);
@@ -1135,7 +1193,7 @@ tparm(const char *string,
     tps->tname = "tparm";
 #endif /* TRACE */
 
-    if (tparm_setup(cur_term, string, &myData) == OK) {
+    if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
 
        myData.param[0] = a1;
        myData.param[1] = a2;
@@ -1166,7 +1224,7 @@ tiparm(const char *string, ...)
     tps->tname = "tiparm";
 #endif /* TRACE */
 
-    if (tparm_setup(cur_term, string, &myData) == OK) {
+    if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
        va_list ap;
 
        va_start(ap, string);
@@ -1179,7 +1237,25 @@ tiparm(const char *string, ...)
 }
 
 /*
- * The internal-use flavor ensures that the parameters are numbers, not strings
+ * The internal-use flavor ensures that parameters are numbers, not strings.
+ * In addition to ensuring that they are numbers, it ensures that the parameter
+ * count is consistent with intended usage.
+ *
+ * Unlike the general-purpose tparm/tiparm, these internal calls are fairly
+ * well defined:
+ *
+ * expected == 0 - not applicable
+ * expected == 1 - set color, or vertical/horizontal addressing
+ * expected == 2 - cursor addressing
+ * expected == 4 - initialize color or color pair
+ * expected == 9 - set attributes
+ *
+ * Only for the last case (set attributes) should a parameter be optional.
+ * Also, a capability which calls for more parameters than expected should be
+ * ignored.
+ *
+ * Return a null if the parameter-checks fail.  Otherwise, return a pointer to
+ * the formatted capability string.
  */
 NCURSES_EXPORT(char *)
 _nc_tiparm(int expected, const char *string, ...)
@@ -1189,22 +1265,36 @@ _nc_tiparm(int expected, const char *string, ...)
     char *result = NULL;
 
     _nc_tparm_err = 0;
+    T((T_CALLED("_nc_tiparm(%d, %s, ...)"), expected, _nc_visbuf(string)));
 #ifdef TRACE
     tps->tname = "_nc_tiparm";
 #endif /* TRACE */
 
-    if (tparm_setup(cur_term, string, &myData) == OK
-       && myData.num_actual <= expected
-       && myData.tparm_type == 0) {
-       va_list ap;
+    if (tparm_setup(cur_term, string, &myData) == OK && ValidCap()) {
+       if (myData.num_actual == 0) {
+           T(("missing parameter%s, expected %s%d",
+              expected > 1 ? "s" : "",
+              expected == 9 ? "up to " : "",
+              expected));
+       } else if (myData.num_actual > expected) {
+           T(("too many parameters, have %d, expected %d",
+              myData.num_actual,
+              expected));
+       } else if (expected != 9 && myData.num_actual != expected) {
+           T(("expected %d parameters, have %d",
+              myData.num_actual,
+              expected));
+       } else {
+           va_list ap;
 
-       va_start(ap, string);
-       tparm_copy_valist(&myData, FALSE, ap);
-       va_end(ap);
+           va_start(ap, string);
+           tparm_copy_valist(&myData, FALSE, ap);
+           va_end(ap);
 
-       result = tparam_internal(tps, string, &myData);
+           result = tparam_internal(tps, string, &myData);
+       }
     }
-    return result;
+    returnPtr(result);
 }
 
 /*
index 2b1875edf13fdb84b44003c44420ee5aa6557319..9c6e9b0e8277f47b87f95238b644c22af3ef2fa8 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2018-2022,2023 Thomas E. Dickey                                *
  * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -42,7 +42,7 @@
 
 #include <tic.h>
 
-MODULE_ID("$Id: read_entry.c,v 1.164 2022/05/08 00:11:44 tom Exp $")
+MODULE_ID("$Id: read_entry.c,v 1.165 2023/04/08 20:14:49 tom Exp $")
 
 #define MyNumber(n) (short) LOW_MSB(n)
 
@@ -323,6 +323,9 @@ _nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit)
        || bool_count < 0
        || num_count < 0
        || str_count < 0
+       || bool_count > BOOLCOUNT
+       || num_count > NUMCOUNT
+       || str_count > STRCOUNT
        || str_size < 0) {
        returnDB(TGETENT_NO);
     }
index dfdd012574c26a5cce52e8019c75b8b718e59973..2ef8ef4b086fb3e3e6c7d5ee77b18eadb877b2be 100644 (file)
@@ -1,8 +1,8 @@
-ncurses6 (6.4+20230401) unstable; urgency=low
+ncurses6 (6.4+20230408) unstable; urgency=low
 
   * latest weekly patch
 
- -- Thomas E. Dickey <dickey@invisible-island.net>  Sat, 01 Apr 2023 07:05:21 -0400
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 06 Apr 2023 16:24:50 -0400
 
 ncurses6 (5.9+20131005) unstable; urgency=low
 
index dfdd012574c26a5cce52e8019c75b8b718e59973..2ef8ef4b086fb3e3e6c7d5ee77b18eadb877b2be 100644 (file)
@@ -1,8 +1,8 @@
-ncurses6 (6.4+20230401) unstable; urgency=low
+ncurses6 (6.4+20230408) unstable; urgency=low
 
   * latest weekly patch
 
- -- Thomas E. Dickey <dickey@invisible-island.net>  Sat, 01 Apr 2023 07:05:21 -0400
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 06 Apr 2023 16:24:50 -0400
 
 ncurses6 (5.9+20131005) unstable; urgency=low
 
index b0b297ccdd211bac2810ecfbdd7f65f63586ed64..9ffc90be022be66c6f63f54c66a357d1d5451511 100644 (file)
@@ -1,8 +1,8 @@
-ncurses6 (6.4+20230401) unstable; urgency=low
+ncurses6 (6.4+20230408) unstable; urgency=low
 
   * latest weekly patch
 
- -- Thomas E. Dickey <dickey@invisible-island.net>  Sat, 01 Apr 2023 07:05:21 -0400
+ -- Thomas E. Dickey <dickey@invisible-island.net>  Thu, 06 Apr 2023 16:24:50 -0400
 
 ncurses6 (5.9+20120608) unstable; urgency=low
 
index 917556e82d2cdff3b605cdaa0c376137da7a2392..f7bebfa14e097bec79d5f3e91081a9bfd7e26738 100644 (file)
@@ -1,4 +1,4 @@
-; $Id: mingw-ncurses.nsi,v 1.572 2023/04/01 11:05:21 tom Exp $\r
+; $Id: mingw-ncurses.nsi,v 1.573 2023/04/06 20:24:50 tom Exp $\r
 \r
 ; TODO add examples\r
 ; TODO bump ABI to 6\r
@@ -10,7 +10,7 @@
 !define VERSION_MAJOR "6"\r
 !define VERSION_MINOR "4"\r
 !define VERSION_YYYY  "2023"\r
-!define VERSION_MMDD  "0401"\r
+!define VERSION_MMDD  "0408"\r
 !define VERSION_PATCH ${VERSION_YYYY}${VERSION_MMDD}\r
 \r
 !define MY_ABI   "5"\r
index 7934974974e44798ec40b316bc9dc0ed5b08a30b..0a48057e07d8367201268e4799beb318ca778196 100644 (file)
@@ -3,7 +3,7 @@
 Summary: shared libraries for terminal handling
 Name: mingw32-ncurses6
 Version: 6.4
-Release: 20230401
+Release: 20230408
 License: X11
 Group: Development/Libraries
 URL: https://invisible-island.net/ncurses/
index cbc0cb6bde0f0b41213338ee96c553a1e438ff55..fc90af3334642b7654b29d5d4895925039eaa16a 100644 (file)
@@ -1,7 +1,7 @@
 Summary: shared libraries for terminal handling
 Name: ncurses6
 Version: 6.4
-Release: 20230401
+Release: 20230408
 License: X11
 Group: Development/Libraries
 URL: https://invisible-island.net/ncurses/
index 0403832b09cd05f2ebedf2b8f7de26d6914366dc..f1d073d14045142f5bbb98ccee95d250682c395f 100644 (file)
@@ -1,7 +1,7 @@
 Summary: Curses library with POSIX thread support.
 Name: ncursest6
 Version: 6.4
-Release: 20230401
+Release: 20230408
 License: X11
 Group: Development/Libraries
 Source: ncurses-%{version}-%{release}.tgz
index 93a0b4916e269ffbd3648ebc137d5a5990044520..7ae616777db9ec89ac07b238eb9db7ccc5fb81ee 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2018-2022,2023 Thomas E. Dickey                                *
  * Copyright 1998-2017,2018 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -49,7 +49,7 @@
 #include <parametrized.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.320 2022/09/17 18:55:28 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.321 2023/04/08 15:51:57 tom Exp $")
 
 #define STDIN_NAME "<stdin>"
 
@@ -2270,9 +2270,15 @@ check_1_infotocap(const char *name, NCURSES_CONST char *value, int count)
 
     _nc_reset_tparm(NULL);
     switch (actual) {
+    case Str:
+       result = TPARM_1(value, strings[1]);
+       break;
     case Num_Str:
        result = TPARM_2(value, numbers[1], strings[2]);
        break;
+    case Str_Str:
+       result = TPARM_2(value, strings[1], strings[2]);
+       break;
     case Num_Str_Str:
        result = TPARM_3(value, numbers[1], strings[2], strings[3]);
        break;
index 3da4a0774af5164eab3f2d7655b6f491a83a5cf6..4fed96a534400dfaf9833a6fe14b4a8f4b57d966 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2020,2023 Thomas E. Dickey                                     *
  * Copyright 2014,2015 Free Software Foundation, Inc.                       *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -33,7 +33,7 @@
 
 #include <tparm_type.h>
 
-MODULE_ID("$Id: tparm_type.c,v 1.4 2020/10/24 17:30:32 tom Exp $")
+MODULE_ID("$Id: tparm_type.c,v 1.5 2023/04/08 15:57:01 tom Exp $")
 
 /*
  * Lookup the type of call we should make to tparm().  This ignores the actual
@@ -47,6 +47,7 @@ tparm_type(const char *name)
        {code, {longname} }, \
        {code, {ti} }, \
        {code, {tc} }
+#define XD(code, onlyname) TD(code, onlyname, onlyname, onlyname)
     TParams result = Numbers;
     /* *INDENT-OFF* */
     static const struct {
@@ -58,6 +59,10 @@ tparm_type(const char *name)
        TD(Num_Str,     "pkey_xmit",    "pfx",          "px"),
        TD(Num_Str,     "plab_norm",    "pln",          "pn"),
        TD(Num_Str_Str, "pkey_plab",    "pfxl",         "xl"),
+#if NCURSES_XNAMES
+       XD(Str,         "Cs"),
+       XD(Str_Str,     "Ms"),
+#endif
     };
     /* *INDENT-ON* */
 
@@ -80,12 +85,16 @@ guess_tparm_type(int nparam, char **p_is_s)
     case 1:
        if (!p_is_s[0])
            result = Numbers;
+       if (p_is_s[0])
+           result = Str;
        break;
     case 2:
        if (!p_is_s[0] && !p_is_s[1])
            result = Numbers;
        if (!p_is_s[0] && p_is_s[1])
            result = Num_Str;
+       if (p_is_s[0] && p_is_s[1])
+           result = Str_Str;
        break;
     case 3:
        if (!p_is_s[0] && !p_is_s[1] && !p_is_s[2])
index 7c102a309c1a423db36427bca2a7693f76df3b5a..2f7bd0771d5318b8137b5ce73861d0fb144cd4ae 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2020 Thomas E. Dickey                                          *
+ * Copyright 2020,2023 Thomas E. Dickey                                     *
  * Copyright 2014 Free Software Foundation, Inc.                            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
@@ -32,7 +32,7 @@
  ****************************************************************************/
 
 /*
- * $Id: tparm_type.h,v 1.3 2020/10/24 17:11:33 tom Exp $
+ * $Id: tparm_type.h,v 1.4 2023/04/08 15:41:20 tom Exp $
  *
  * determine expected/actual number of parameters to setup for tparm
  */
 typedef enum {
     Other = -1
     ,Numbers = 0
+    ,Str
     ,Num_Str
     ,Num_Str_Str
+    ,Str_Str
 } TParams;
 
 extern TParams tparm_type(const char *name);
index 4cd0c5baa3b8f1c2f70888813a96c90de8a84756..41508b72777b0229cfcf3046bac05cd59aa7d3a7 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright 2018-2021,2022 Thomas E. Dickey                                *
+ * Copyright 2018-2022,2023 Thomas E. Dickey                                *
  * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
 #include <transform.h>
 #include <tty_settings.h>
 
-MODULE_ID("$Id: tput.c,v 1.99 2022/02/26 23:19:31 tom Exp $")
+MODULE_ID("$Id: tput.c,v 1.102 2023/04/08 16:26:36 tom Exp $")
 
 #define PUTS(s)                fputs(s, stdout)
 
 const char *_nc_progname = "tput";
 
+static bool opt_v = FALSE;     /* quiet, do not show warnings */
+static bool opt_x = FALSE;     /* clear scrollback if possible */
+
 static bool is_init = FALSE;
 static bool is_reset = FALSE;
 static bool is_clear = FALSE;
@@ -81,6 +84,7 @@ usage(const char *optstring)
        KEEP("  -S <<       read commands from standard input")
        KEEP("  -T TERM     use this instead of $TERM")
        KEEP("  -V          print curses-version")
+       KEEP("  -v          verbose, show warnings")
        KEEP("  -x          do not try to clear scrollback")
        KEEP("")
        KEEP("Commands:")
@@ -148,7 +152,7 @@ exit_code(int token, int value)
  * Returns nonzero on error.
  */
 static int
-tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
+tput_cmd(int fd, TTY * settings, int argc, char **argv, int *used)
 {
     NCURSES_CONST char *name;
     char *s;
@@ -231,7 +235,9 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
     } else if (VALID_STRING(s)) {
        if (argc > 1) {
            int k;
+           int narg;
            int analyzed;
+           int provided;
            int popcount;
            long numbers[1 + NUM_PARM];
            char *strings[1 + NUM_PARM];
@@ -271,14 +277,45 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
 
            popcount = 0;
            _nc_reset_tparm(NULL);
+           /*
+            * Count the number of numeric parameters which are provided.
+            */
+           provided = 0;
+           for (narg = 1; narg < argc; ++narg) {
+               char *ending = NULL;
+               long check = strtol(argv[narg], &ending, 10);
+               if (check < 0 || ending == argv[narg] || *ending != '\0')
+                   break;
+               provided = narg;
+           }
            switch (paramType) {
+           case Str:
+               s = TPARM_1(s, strings[1]);
+               analyzed = 1;
+               if (provided == 0 && argc >= 1)
+                   provided++;
+               break;
+           case Str_Str:
+               s = TPARM_2(s, strings[1], strings[2]);
+               analyzed = 2;
+               if (provided == 0 && argc >= 1)
+                   provided++;
+               if (provided == 1 && argc >= 2)
+                   provided++;
+               break;
            case Num_Str:
                s = TPARM_2(s, numbers[1], strings[2]);
                analyzed = 2;
+               if (provided == 1 && argc >= 2)
+                   provided++;
                break;
            case Num_Str_Str:
                s = TPARM_3(s, numbers[1], strings[2], strings[3]);
                analyzed = 3;
+               if (provided == 1 && argc >= 2)
+                   provided++;
+               if (provided == 2 && argc >= 3)
+                   provided++;
                break;
            case Numbers:
                analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount);
@@ -316,7 +353,13 @@ tput_cmd(int fd, TTY * settings, bool opt_x, int argc, char **argv, int *used)
            if (analyzed < popcount) {
                analyzed = popcount;
            }
-           *used += analyzed;
+           if (opt_v && (analyzed != provided)) {
+               fprintf(stderr, "%s: %s parameters for \"%s\"\n",
+                       _nc_progname,
+                       (analyzed < provided ? "extra" : "missing"),
+                       argv[0]);
+           }
+           *used += provided;
        }
 
        /* use putp() in order to perform padding */
@@ -339,7 +382,6 @@ main(int argc, char **argv)
     int used;
     TTY old_settings;
     TTY tty_settings;
-    bool opt_x = FALSE;                /* clear scrollback if possible */
     bool is_alias;
     bool need_tty;
 
@@ -348,7 +390,7 @@ main(int argc, char **argv)
 
     term = getenv("TERM");
 
-    while ((c = getopt(argc, argv, is_alias ? "T:Vx" : "ST:Vx")) != -1) {
+    while ((c = getopt(argc, argv, is_alias ? "T:Vvx" : "ST:Vvx")) != -1) {
        switch (c) {
        case 'S':
            cmdline = FALSE;
@@ -361,6 +403,9 @@ main(int argc, char **argv)
        case 'V':
            puts(curses_version());
            ExitProgram(EXIT_SUCCESS);
+       case 'v':               /* verbose */
+           opt_v = TRUE;
+           break;
        case 'x':               /* do not try to clear scrollback */
            opt_x = TRUE;
            break;
@@ -404,7 +449,7 @@ main(int argc, char **argv)
            usage(NULL);
        while (argc > 0) {
            tty_settings = old_settings;
-           code = tput_cmd(fd, &tty_settings, opt_x, argc, argv, &used);
+           code = tput_cmd(fd, &tty_settings, argc, argv, &used);
            if (code != 0)
                break;
            argc -= used;
@@ -439,7 +484,7 @@ main(int argc, char **argv)
        while (argnum > 0) {
            int code;
            tty_settings = old_settings;
-           code = tput_cmd(fd, &tty_settings, opt_x, argnum, argnow, &used);
+           code = tput_cmd(fd, &tty_settings, argnum, argnow, &used);
            if (code != 0) {
                if (result == 0)
                    result = ErrSystem(0);      /* will return value >4 */