]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - man/curs_terminfo.3x
ncurses 6.4 - patch 20230917
[ncurses.git] / man / curs_terminfo.3x
index 9abad1b04c3498b289aac7fbf9479eff5204e3d3..bd418951454c91881acd26a07e59534e731a4e43 100644 (file)
@@ -1,5 +1,6 @@
+'\" t
 .\"***************************************************************************
-.\" 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,8 +28,8 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: curs_terminfo.3x,v 1.81 2022/02/12 20:05:11 tom Exp $
-.TH curs_terminfo 3X ""
+.\" $Id: curs_terminfo.3x,v 1.99 2023/09/16 23:37:03 tom Exp $
+.TH curs_terminfo 3X 2023-09-16 "ncurses 6.4" "Library calls"
 .ie \n(.g .ds `` \(lq
 .el       .ds `` ``
 .ie \n(.g .ds '' \(rq
 .el    .IP \(bu 2
 ..
 .ds n 5
-.na
-.hy 0
 .SH NAME
-\fBdel_curterm\fP,
-\fBmvcur\fP,
-\fBputp\fP,
-\fBrestartterm\fP,
-\fBset_curterm\fP,
-\fBsetupterm\fP,
-\fBtigetflag\fP,
-\fBtigetnum\fP,
-\fBtigetstr\fP,
-\fBtiparm\fP,
-\fBtparm\fP,
-\fBtputs\fP,
-\fBvid_attr\fP,
-\fBvid_puts\fP,
-\fBvidattr\fP,
-\fBvidputs\fP \- \fBcurses\fP interfaces to terminfo database
-.ad
-.hy
+\fB\%del_curterm\fP,
+\fB\%mvcur\fP,
+\fB\%putp\fP,
+\fB\%restartterm\fP,
+\fB\%set_curterm\fP,
+\fB\%setupterm\fP,
+\fB\%tigetflag\fP,
+\fB\%tigetnum\fP,
+\fB\%tigetstr\fP,
+\fB\%tiparm\fP,
+\fB\%tiparm_s\fP,
+\fB\%tiscan_s\fP,
+\fB\%tparm\fP,
+\fB\%tputs\fP,
+\fB\%vid_attr\fP,
+\fB\%vid_puts\fP,
+\fB\%vidattr\fP,
+\fB\%vidputs\fP \-
+\fIcurses\fR interfaces to \fIterminfo\fR database
 .SH SYNOPSIS
 .nf
 \fB#include <curses.h>\fP
 .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
 \fBchar *tigetstr(const char *\fIcapname\fB);\fR
 .sp
 \fBchar *tiparm(const char *\fIstr\fB, ...);\fR
+.sp
+/* extensions */
+.br
+\fBchar *tiparm_s(int \fIexpected\fB, int \fImask\fB, const char *\fIstr\fB, ...);\fR
+.br
+\fBint tiscan_s(int *\fIexpected\fB, int *\fImask\fB, const char *\fIstr\fB);\fR
 .br
 .fi
 .SH DESCRIPTION
@@ -125,7 +135,6 @@ capability names use the POSIX portable character set
 capability string values have no associated encoding;
 they are strings of 8-bit characters.
 .SS Initialization
-.PP
 Initially, \fBsetupterm\fP should be called.
 The high-level curses functions \fBinitscr\fP and
 \fBnewterm\fP call \fBsetupterm\fP to initialize the
@@ -189,7 +198,12 @@ is the terminal type, a character string.
 If \fIterm\fP is null, the environment variable \fBTERM\fP is used.
 .TP 5
 \fIfiledes\fP
-is the file descriptor used for all output.
+is the file descriptor used for getting and setting terminal I/O modes.
+.IP
+Higher-level applications use \fBnewterm\fP(3X) for initializing the terminal,
+passing an output \fIstream\fP rather than a \fIdescriptor\fP.
+In curses, the two are the same because \fBnewterm\fP calls \fBsetupterm\fP,
+passing the file descriptor derived from its output stream parameter.
 .TP 5
 \fIerrret\fP
 points to an optional location where an error status can be returned to
@@ -216,7 +230,7 @@ or that it is a generic type,
 having too little information for curses applications to run.
 .IP
 \fBsetupterm\fP determines if the entry is a generic type by
-checking the \fBgn\fP (\fBgeneric\fP) capability.
+checking the \fBgn\fP (\fBgeneric_type\fP) capability.
 .TP 5
 .B \-1
 means that the \fBterminfo\fP database could not be found.
@@ -233,7 +247,6 @@ which uses all the defaults and sends the output to \fBstdout\fP.
 .RE
 .\" ***************************************************************************
 .SS The Terminal State
-.PP
 The \fBsetupterm\fP routine stores its information about the terminal
 in a \fBTERMINAL\fP structure pointed to by the global variable \fBcur_term\fP.
 If it detects an error,
@@ -269,7 +282,6 @@ Accordingly, \fBrestartterm\fP saves various tty state bits,
 calls \fBsetupterm\fP, and then restores the bits.
 .\" ***************************************************************************
 .SS Formatting Output
-.PP
 The \fBtparm\fP routine instantiates the string \fIstr\fP with
 parameters \fIpi\fP.  A pointer is returned to the result of \fIstr\fP
 with the parameters applied.
@@ -290,9 +302,24 @@ Use \*(``\\200\*('' where an ASCII NUL is needed in the output.
 \fBtiparm\fP is a newer form of \fBtparm\fP which uses \fI<stdarg.h>\fP
 rather than a fixed-parameter list.
 Its numeric parameters are integers (int) rather than longs.
+.PP
+Both \fBtparm\fP and \fBtiparm\fP assume that the application passes
+parameters consistent with the terminal description.
+Two extensions are provided as alternatives to deal with untrusted data:
+.bP
+\fBtiparm_s\fP is an extension which is a safer formatting function
+than \fBtparm\fR or \fBtiparm\fR,
+because it allows the developer to tell the curses
+library how many parameters to expect in the parameter list,
+and which may be string parameters.
+.IP
+The \fImask\fP parameter has one bit set for each of the parameters
+(up to 9) which will be passed as char* rather than numbers.
+.bP
+The extension \fBtiscan_s\fP allows the application
+to inspect a formatting capability to see what the curses library would assume.
 .\" ***************************************************************************
 .SS Output Functions
-.PP
 The \fBtputs\fP routine applies padding information
 (i.e., by interpreting marker embedded in the terminfo capability
 such as \*(``$<5>\*('' as 5 milliseconds)
@@ -346,6 +373,10 @@ which overrides the \fIpair\fP (\fBshort\fP) argument.
 .PP
 The \fBmvcur\fP routine provides low-level cursor motion.
 It takes effect immediately (rather than at the next refresh).
+Unlike the other low-level output functions,
+which either write to the standard output or pass an output function parameter,
+\fBmvcur\fP uses an output file descriptor derived from
+the output stream parameter of \fBnewterm\fP(3X).
 .PP
 While \fBputp\fP and \fBmvcur\fP are low-level functions which
 do not use the high-level curses state,
@@ -353,7 +384,6 @@ they are declared in \fB<curses.h>\fP because SystemV did this
 (see \fIHISTORY\fP).
 .\" ***************************************************************************
 .SS Terminal Capability Functions
-.PP
 The \fBtigetflag\fP, \fBtigetnum\fP and \fBtigetstr\fP routines return
 the value of the capability corresponding to the \fBterminfo\fP
 \fIcapname\fP passed to them, such as \fBxenl\fP.
@@ -389,7 +419,6 @@ or
 if it is canceled or absent from the terminal description.
 .\" ***************************************************************************
 .SS Terminal Capability Names
-.PP
 These null-terminated arrays contain
 .bP
 the short terminfo names (\*(``codes\*(''),
@@ -410,15 +439,16 @@ for each of the predefined \fBterminfo\fP variables:
 .\" ***************************************************************************
 .SS Releasing Memory
 Each successful call to \fBsetupterm\fP allocates memory to hold the terminal
-description.  As a side-effect, it sets \fBcur_term\fP to point to this memory.
+description.
+As a side-effect, it sets \fBcur_term\fP to point to this memory.
 If an application calls
 .sp
-       \fBdel_curterm(cur_term);\fP
+        \fBdel_curterm(cur_term);\fP
 .sp
 the memory will be freed.
 .PP
 The formatting functions \fBtparm\fP and \fBtiparm\fP extend the storage
-allocated by \fBsetupterm\fP: 
+allocated by \fBsetupterm\fP:
 .bP
 the \*(``static\*('' terminfo variables [a-z].
 Before ncurses 6.3, those were shared by all screens.
@@ -462,6 +492,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:
@@ -495,14 +530,13 @@ This implementation provides each of those symbols
 as macros for BSD compatibility,
 .\" ***************************************************************************
 .SH HISTORY
-.PP
 SVr2 introduced the terminfo feature.
 Its programming manual mentioned these low-level functions:
+.PP
 .TS
-l l
-_ _
 l l.
 \fBFunction\fP \fBDescription\fP
+_
 fixterm        restore tty to \*(``in curses\*('' state
 gettmode       establish current tty modes
 mvcur  low level cursor motion
@@ -526,6 +560,7 @@ T}
 The programming manual also mentioned
 functions provided for termcap compatibility
 (commenting that they \*(``may go away at a later date\*(''):
+.PP
 .TS
 l l
 _ _
@@ -547,6 +582,7 @@ Early terminfo programs obtained capability values from the
 SVr3 extended terminfo by adding functions to retrieve capability values
 (like the termcap interface),
 and reusing tgoto and tputs:
+.PP
 .TS
 l l
 _ _
@@ -599,15 +635,17 @@ but none were documented.
 The functions marked \*(``obsolete\*('' remained in use
 by the Unix \fBvi\fP(1) editor.
 .SH PORTABILITY
+.SS Extensions
+The functions marked as extensions were designed for \fBncurses\fP(3X),
+and are not found in SVr4 curses, 4.4BSD curses,
+or any other previous version of curses.
 .SS Legacy functions
-.PP
 X/Open notes that \fBvidattr\fP and \fBvidputs\fP may be macros.
 .PP
 The function \fBsetterm\fP is not described by X/Open and must
 be considered non-portable.
 All other functions are as described by X/Open.
 .SS Legacy data
-.PP
 \fBsetupterm\fP copies the terminal name to the array \fBttytype\fP.
 This is not part of X/Open Curses, but is assumed by some applications.
 .PP
@@ -618,7 +656,6 @@ X/Open does not specify them.
 Extended terminal capability names, e.g., as defined by \fB@TIC@\ \-x\fP,
 are not stored in the arrays described here.
 .SS Output buffering
-.PP
 Older versions of \fBncurses\fP assumed that the file descriptor passed to
 \fBsetupterm\fP from \fBinitscr\fP or \fBnewterm\fP uses buffered I/O,
 and would write to the corresponding stream.
@@ -636,7 +673,6 @@ The high-level functions in \fBncurses\fP use
 alternate versions of these functions
 using the more reliable buffering scheme.
 .SS Function prototypes
-.PP
 The X/Open Curses prototypes are based on the SVr4 curses header declarations,
 which were defined at the same time the C language was first standardized in
 the late 1980s.
@@ -662,19 +698,53 @@ 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.
-.SS Special TERM treatment
+.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 standardized.
+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 \fB@TPUT@\fR(1) program checks its use of these capabilities with a table,
+so that it calls \fBtparm\fP correctly.
+.SS Special TERM treatment
 If configured to use the terminal-driver,
 e.g., for the MinGW port,
 .bP
 \fBsetupterm\fP interprets a missing/empty TERM variable as the
 special value \*(``unknown\*(''.
+.IP
+SVr4 curses uses the
+special value \*(``dumb\*(''.
+.IP
+The difference between the two is that
+the former uses the \fBgn\fP (\fBgeneric_type\fR) terminfo capability,
+while the latter does not.
+A generic terminal is unsuitable for full-screen applications.
 .bP
 \fBsetupterm\fP allows explicit use of the
 the windows console driver by checking if $TERM is set to
 \*(``#win32con\*('' or an abbreviation of that string.
 .SS Other portability issues
-.PP
 In System V Release 4, \fBset_curterm\fP has an \fBint\fP return type and
 returns \fBOK\fP or \fBERR\fP.  We have chosen to implement the X/Open Curses
 semantics.