Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
curs_termcap(3X)		  Library calls 		curs_termcap(3X)

NAME
     PC,  UP,  BC,  ospeed,  tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs -
     curses emulation of termcap

SYNOPSIS
     #include <curses.h>
     #include <term.h>

     char PC;
     char * UP;
     char * BC;
     short ospeed;

     int tgetent(char * bp, const char * name);
     int tgetflag(const char * id);
     int tgetnum(const char * id);
     char * tgetstr(const char * id, char ** sbuf);
     char * tgoto(const char * cap, int col, int row);
     int tputs(const char * str, int affcnt, int (* putc)(int));

DESCRIPTION
     ncurses provides the foregoing variables and functions as	a  compatibility
     layer  for programs that use the termcap library.	The API is the same, but
     behavior is emulated using the terminfo database.	Thus,  it  can	be  used
     only  to  query  the  capabilities of terminal database entries for which a
     terminfo entry has been compiled.

   Initialization
     tgetent loads the terminal database entry for name; see term(7).  This must
     be done before calling any of the other functions.  It returns

	1    on success,

	0    if there is no such entry (or if the  matching  entry  describes  a
	     generic terminal, having too little information for curses applica-
	     tions to run), and

	-1   if the terminfo database could not be found.

     This implementation differs from those of historical termcap libraries.

     *	 ncurses  ignores the buffer pointer bp, as do other termcap implementa-
	 tions conforming to portions of X/Open Curses now withdrawn.	The  BSD
	 termcap  library would store a copy of the terminal type description in
	 the buffer referenced by this pointer.  terminfo stores  terminal  type
	 descriptions in compiled form, which is not the same thing.

     *	 The meanings of the return values differ.  The BSD termcap library does
	 not  check  whether  the terminal type description includes the generic
	 (gn) capability, nor whether the terminal type description supports  an
	 addressable  cursor, a property essential for any curses implementation
	 to operate.

   Retrieving Capability Values
     tgetflag reports the Boolean entry for id, or zero if it is not available.

     tgetnum obtains the numeric entry for id, or -1 if it is not available.

     tgetstr returns the string entry for id, or NULL if it  is  not  available.
     Use  tputs  to  output  the string returned.  The sbuf parameter is used as
     follows.

     *	 It is assumed to be the address of a pointer to a buffer managed by the
	 calling application.

     *	 However, ncurses checks to ensure that sbuf is not NULL, and  that  the
	 pointer  obtained  by	dereferencing  sbuf is also not NULL.  If either
	 check fails, ncurses ignores sbuf.

     *	 If the checks succeed, ncurses also copies  the  return  value  to  the
	 buffer  pointed  to by sbuf, and the library updates sbuf to point past
	 the null character terminating this value.

     *	 The return value itself is an address in the terminal type  description
	 loaded into memory.

   Applying String Capabilities
     String  capabilities  can	be  parameterized; see subsection "Parameterized
     Strings" in  terminfo(5).	tgoto applies its second and third arguments  to
     the parametric placeholders in the capability stored in the first argument.

     *	 The  capability may contain padding specifications; see subsection "De-
	 lays and Padding" of terminfo(5).  The output of tgoto should	thus  be
	 passed  to  tputs  rather  than  some	other  output  function  such as
	 printf(3).

     *	 While tgoto is assumed to be used for the  two-parameter  cursor  posi-
	 tioning capability, termcap applications also use it for single-parame-
	 ter capabilities.

	 Doing	so  reveals a quirk in tgoto: most hardware terminals use cursor
	 addressing with row first, but the original developers of  the  termcap
	 interface  chose  to  put  the col (column) parameter first.  The tgoto
	 function swaps the order of its parameters.   It  does  this  even  for
	 calls requiring only a single parameter.  In that case, the first para-
	 meter is merely a placeholder.

     *	 Normally  the ncurses library is compiled without full termcap support.
	 In that case, tgoto uses an internal version of tparm(3X) (a more capa-
	 ble function).

	 Because it uses tparm internally, tgoto is able to  use  some	terminfo
	 features,  but  not all.  In particular, it allows only numeric parame-
	 ters; tparm supports string parameters.

	 However, tparm is not a termcap feature, and portable termcap	applica-
	 tions should not rely upon its availability.

     tputs  is	described in curs_terminfo(3X).  It can retrieve capabilities by
     either termcap or terminfo code.

   Global Variables
     tgetent sets the variables PC, UP, and BC to the terminfo entry's data  for
     pad_char  (pad),  cursor_up (cuu1), and backspace_if_not_bs (OTbs), respec-
     tively.  ncurses does not employ cuu1  internally.   delay_output(3X)  uses
     pad,  while tgoto emulation uses the obsolete termcap capability bs, repre-
     sented in ncurses terminfo as "OTbs".  ncurses assigns the variable  ospeed
     a system-specific value to encode the terminal's data rate.

   Releasing Memory
     The  termcap  functions  provide no means of freeing memory, because legacy
     termcap implementations used only the storage provided by	the  caller  via
     tgetent and tgetstr.  Those buffers are unused in terminfo.

     By  contrast,  terminfo  allocates memory.  It uses setupterm(3X) to obtain
     the data used by tgetent and the functions that retrieve capability values.
     One could use
	    del_curterm(cur_term);
     to free this memory, but there is an additional complication with	ncurses.
     It uses a fixed-size pool of storage locations, one per value of the termi-
     nal  name	parameter  given  to tgetent.  The screen(1) program relies upon
     this arrangement to improve its performance.

     An application that uses only the termcap functions, not  the  higher-level
     curses  API,  could  release  the memory using del_curterm(3X), because the
     pool is freed using other functions; see curs_memleaks(3X).

RETURN VALUE
     The return values of tgetent, tgetflag, tgetname,	and  tgetstr  are  docu-
     mented above.

     tgoto returns NULL on error.  Error conditions include:

     *	 uninitialized state (tgetent was not called successfully),

     *	 cap being a null pointer,

     *	 cap referring to a canceled capability,

     *	 cap  being  a capability with string-valued parameters (a terminfo-only
	 feature), and

     *	 cap being a capability with more than two parameters.

     See curs_terminfo(3X) regarding tputs.

NOTES
     ncurses compares only the first two  characters  of  the  id  parameter  of
     tgetflag, tgetnum, and tgetstr to the capability names in the database.

PORTABILITY
     These  functions are no longer standardized (and the variables never were);
     see section "HISTORY" below.  ncurses provides them to support  legacy  ap-
     plications; they should not be used in new programs.

     SVr4  describes  a  successful return value only as "an integer value other
     than ERR".

     Neither X/Open Curses nor the SVr4 man pages documented the  return  values
     of  tgetent  correctly,  though  all three shown here were in fact returned
     ever since SVr1.  In particular, an omission in the X/Open Curses	specifi-
     cation has been misinterpreted to mean that tgetent returns OK or ERR.  Be-
     cause  the  purpose of these functions is to provide compatibility with the
     termcap library, that is a defect in X/Open Curses Issue 4 Version 2 rather
     than in ncurses.

   Compatibility with BSD termcap
     ncurses provides externally visible variables to  support	certain  termcap
     applications.  However, their correct usage is poorly documented; for exam-
     ple, it is unclear when reading and writing them is meaningful.  In partic-
     ular, some applications are reported to declare and/or modify ospeed.

     The  constraint  that only the first two characters of the id parameter are
     looked up in the terminal database  escapes  many	application  developers.
     The BSD termcap library did not require a trailing null character after the
     capability  identifier  passed to tgetstr, tgetnum, and tgetflag.	Some ap-
     plications thus assume that the termcap  interface  does  not  require  the
     trailing  null  character for the capability identifier.  ncurses disallows
     matches by the termcap interface against extended capability names that are
     longer than two characters; see user_caps(5).

     The BSD termcap function tgetent returns the text of a termcap entry in the
     buffer passed as an argument.  ncurses,  like  other  terminfo  implementa-
     tions,  does  not	store  terminal  type descriptions as text.  It sets the
     buffer contents to a null-terminated string.

   Header File
     ncurses includes a termcap.h header file for compatibility with  other  im-
     plementations,  but it is rarely used because the other implementations are
     not mutually compatible; see below.

HISTORY
     Bill Joy originated a forerunner of termcap called "ttycap", dated  Septem-
     ber  1977,  and  released	in  1BSD (March 1978).	It used many of the same
     function names as the later termcap, such as  tgetent,  tgetflag,	tgetnum,
     and tgetstr.

     A	clear  descendant,  the  termlib  library,  followed in 2BSD (May 1979),
     adding tgoto and tputs.  The former applied at that time only to cursor po-
     sitioning capabilities, thus the overly specific name.  Little  changed  in
     3BSD  (late  1979)  except  the addition of test programs and a termlib man
     page, which documented the API shown in section "SYNOPSIS" above.

     4BSD (November 1980) renamed termlib to termcap and added another test pro-
     gram.  The library remained much  the  same  through  4.3BSD  (June  1986).
     4.4BSD-Lite (June 1994) refactored it, leaving the API unchanged.

     Function  prototypes were a feature of ANSI C (1989).  The library long an-
     tedated the standard and thus provided no header file declaring them.  Nev-
     ertheless, the BSD sources included two different	termcap.h  header  files
     over time.

     *	 One  was  used  internally  by jove(1) from 4.3BSD onward.  It declared
	 global symbols for the termcap variables that it used.

     *	 The other appeared in 4.4BSD-Lite Release 2  (June  1995)  as	part  of
	 libedit  (also  known	as  the  editline library).  CSRG source history
	 shows that this was added in mid-1992.  The  libedit  header  file  was
	 used  internally  as  a convenience for compiling the editline library.
	 It declared function prototypes, but  no  global  variables.	NetBSD's
	 termcap library added this header file in mid-1994.

     Meanwhile,  GNU termcap began development in 1990.  Its first release (1.0)
     in 1991 included a termcap.h header file.	Its second (1.1) release in Sep-
     tember 1992 modified the file to use const for the function  prototypes  in
     the  header where one would expect parameters to be read-only.  BSD termcap
     did not.  The prototype for tputs also differed, but in that  instance,  it
     was libedit that differed from BSD termcap.

     GNU  bash(1)  has	bundled  GNU  termcap  1.3 since mid-1993 to support its
     readline(3) library, and continues to use it if configured to do so.

     ncurses 1.8.1 (November 1993) provided a termcap.h file.  It reflected  in-
     fluence  from GNU termcap and emacs(1) (rather than jove(1)), providing the
     following interface:

     *	 global symbols used by emacs,

     *	 const-qualified function prototypes, and

     *	 a prototype for tparam, a GNU termcap feature.

     Later (in mid-1996) the tparam function was removed from ncurses.	Any  two
     of  the  four implementations thus differ, and programs that intend to work
     with all termcap library interfaces must account for that fact.

     X/Open Curses Issue 4, Version 2 (1996), describes these functions, marking
     them as "TO BE WITHDRAWN".

     X/Open Curses Issue 7 (2009) withdrew the termcap interface (along with the
     vwprintw and vwscanw functions).

BUGS
     If you call tgetstr to fetch column_address (ch) or any other parameterized
     string capability, be aware that it is returned in terminfo  notation,  not
     the  older  and not-quite-compatible termcap notation.  This does not cause
     problems if all you do with it is call tgoto or tparm, which both	paramet-
     rically  expand  terminfo-style  string capabilities as terminfo does.  (If
     ncurses is configured to support termcap, tgoto checks whether  the  string
     is terminfo-style by looking for "%p" parameters or "<...>" delays, and in-
     vokes a termcap-style parser if the string appears not to use terminfo syn-
     tax.)

     Because  terminfo's  syntax for padding in string capabilities differs from
     termcap's, users can be surprised.

     *	 tputs("50") in a terminfo system transmits "50" rather than  busy-wait-
	 ing for 50 milliseconds.

	 However,  if ncurses is configured to support termcap, it may also have
	 been configured to support BSD-style padding.	In that case, tputs  in-
	 spects strings passed to it, looking for digits at the beginning of the
	 string.

     *	 tputs("50")  in  a  termcap  system  may  busy-wait for 50 milliseconds
	 rather than transmitting "50".

     termcap has nothing analogous to terminfo's set_attributes  (sgr)	capabil-
     ity.  One consequence is that termcap applications assume that "me" (equiv-
     alent  to	terminfo's exit_attribute_mode (sgr0) capability) does not reset
     the alternate character set.  ncurses inspects the  data  shared  with  the
     termcap  interface and modifies it as necessary to accommodate the latter's
     limitation in this respect.

SEE ALSO
     TCTEST -- A Termcap Test Utility

     curses(3X), curs_terminfo(3X), putc(3), term_variables(3X), terminfo(5)

ncurses 6.6			   2025-08-16			curs_termcap(3X)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=curs_termcap&sektion=3&manpath=FreeBSD+15.1-RELEASE+and+Ports.quarterly>

home | help