-- 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
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).
-5:0:10 6.4 20230401
+5:0:10 6.4 20230408
# 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
# 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)
</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).
</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>
</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).
<!--
****************************************************************************
- * 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 *
* 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 "$<..>" 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 "$<..>" 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.
<!--
****************************************************************************
- * 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 *
* 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 @
* ***************************************************************************
* ***************************************************************************
* ***************************************************************************
<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,
<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).
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>
</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>
<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).
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
</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).
</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>
</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).
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>
<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>
<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).
</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).
<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).
.\"***************************************************************************
-.\" 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 *
.\" 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 `` ``
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.
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
.\"***************************************************************************
-.\" 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 *
.\" 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
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:
.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,
# 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
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
# 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!
/****************************************************************************
- * 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 *
#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
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);
}
/****************************************************************************
- * 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 *
#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 *
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 *)
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);
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;
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);
}
/*
- * 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, ...)
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);
}
/*
/****************************************************************************
- * 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 <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)
|| bool_count < 0
|| num_count < 0
|| str_count < 0
+ || bool_count > BOOLCOUNT
+ || num_count > NUMCOUNT
+ || str_count > STRCOUNT
|| str_size < 0) {
returnDB(TGETENT_NO);
}
-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
-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
-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
-; $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
!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
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/
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/
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
/****************************************************************************
- * 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 *
#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>"
_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;
/****************************************************************************
- * 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 *
#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
{code, {longname} }, \
{code, {ti} }, \
{code, {tc} }
+#define XD(code, onlyname) TD(code, onlyname, onlyname, onlyname)
TParams result = Numbers;
/* *INDENT-OFF* */
static const struct {
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* */
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])
/****************************************************************************
- * 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 *
****************************************************************************/
/*
- * $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);
/****************************************************************************
- * 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;
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:")
* 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;
} 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];
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);
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 */
int used;
TTY old_settings;
TTY tty_settings;
- bool opt_x = FALSE; /* clear scrollback if possible */
bool is_alias;
bool need_tty;
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;
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;
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;
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 */