<!-- 
  ****************************************************************************
  * Copyright (c) 1999-2011,2013 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  * "Software"), to deal in the Software without restriction, including      *
  * without limitation the rights to use, copy, modify, merge, publish,      *
  * distribute, distribute with modifications, sublicense, and/or sell       *
  * copies of the Software, and to permit persons to whom the Software is    *
  * furnished to do so, subject to the following conditions:                 *
  *                                                                          *
  * The above copyright notice and this permission notice shall be included  *
  * in all copies or substantial portions of the Software.                   *
  *                                                                          *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
  *                                                                          *
  * Except as contained in this notice, the name(s) of the above copyright   *
  * holders shall not be used in advertising or otherwise to promote the     *
  * sale, use or other dealings in this Software without prior written       *
  * authorization.                                                           *
  ****************************************************************************
  * @Id: curs_terminfo.3x,v 1.43 2013/07/20 19:29:59 tom Exp @
  * ***************************************************************************
  * ***************************************************************************
  * ***************************************************************************
  * ***************************************************************************
  * ***************************************************************************
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="generator" content="Manpage converted by man2html - see http://invisible-island.net/scripts/readme.html#others_scripts">
<TITLE>curs_terminfo 3x</TITLE>
<link rev=made href="mailto:bug-ncurses@gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<H1 class="no-header">curs_terminfo 3x</H1>
<PRE>
<STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>                                     <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>




</PRE>
<H2><a name="h2-NAME">NAME</a></H2><PRE>
       <STRONG>del_curterm</STRONG>, <STRONG>mvcur</STRONG>, <STRONG>putp</STRONG>, <STRONG>restartterm</STRONG>, <STRONG>set_curterm</STRONG>,
       <STRONG>setterm</STRONG>, <STRONG>setupterm</STRONG>, <STRONG>tigetflag</STRONG>, <STRONG>tigetnum</STRONG>, <STRONG>tigetstr</STRONG>, <STRONG>tiparm</STRONG>,
       <STRONG>tparm</STRONG>, <STRONG>tputs</STRONG>, <STRONG>vid_attr</STRONG>, <STRONG>vid_puts</STRONG>, <STRONG>vidattr</STRONG>, <STRONG>vidputs</STRONG> -
       <STRONG>curses</STRONG> interfaces to terminfo database


</PRE>
<H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
       <STRONG>#include</STRONG> <STRONG>&lt;curses.h&gt;</STRONG>
       <STRONG>#include</STRONG> <STRONG>&lt;term.h&gt;</STRONG>

       <STRONG>int</STRONG> <STRONG>setupterm(char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fildes</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>errret</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>setterm(char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>);</STRONG>
       <STRONG>TERMINAL</STRONG> <STRONG>*set_curterm(TERMINAL</STRONG> <STRONG>*</STRONG><EM>nterm</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>del_curterm(TERMINAL</STRONG> <STRONG>*</STRONG><EM>oterm</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>restartterm(char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>fildes</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>errret</EM><STRONG>);</STRONG>
       <STRONG>char</STRONG> <STRONG>*tparm(char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <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>
       <STRONG>int</STRONG> <STRONG>vidputs(chtype</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>putc</EM><STRONG>)(int));</STRONG>
       <STRONG>int</STRONG> <STRONG>vidattr(chtype</STRONG> <EM>attrs</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>vid_puts(attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>putc</EM><STRONG>)(int));</STRONG>
       <STRONG>int</STRONG> <STRONG>vid_attr(attr_t</STRONG> <EM>attrs</EM><STRONG>,</STRONG> <STRONG>short</STRONG> <EM>pair</EM><STRONG>,</STRONG> <STRONG>void</STRONG> <STRONG>*</STRONG><EM>opts</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>mvcur(int</STRONG> <EM>oldrow</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>oldcol</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>newrow</EM>, int <EM>newcol</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>tigetflag(char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
       <STRONG>int</STRONG> <STRONG>tigetnum(char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
       <STRONG>char</STRONG> <STRONG>*tigetstr(char</STRONG> <STRONG>*</STRONG><EM>capname</EM><STRONG>);</STRONG>
       <STRONG>char</STRONG> <STRONG>*tiparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>


</PRE>
<H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
       These low-level routines must be called by  programs  that
       have to deal directly with the <STRONG>terminfo</STRONG> database to handle
       certain terminal capabilities, such as  programming  func-
       tion  keys.   For all other functionality, <STRONG>curses</STRONG> routines
       are more suitable and their use is recommended.


</PRE>
<H3><a name="h3-Initialization">Initialization</a></H3><PRE>
       Initially, <STRONG>setupterm</STRONG> should  be  called.   Note  that  <STRONG>se-</STRONG>
       <STRONG>tupterm</STRONG>  is  automatically  called by <STRONG>initscr</STRONG> and <STRONG>newterm</STRONG>.
       This  defines  the  set  of  terminal-dependent  variables
       [listed in <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>].

       Each initialization routine provides applications with the
       terminal capabilities either directly (via header  defini-
       tions),  or  by special functions.  The header files <STRONG>curs-</STRONG>
       <STRONG>es.h</STRONG> and <STRONG>term.h</STRONG> should be included (in this order) to  get
       the definitions for these strings, numbers, and flags.

       The  <STRONG>terminfo</STRONG>  variables <STRONG>lines</STRONG> and <STRONG>columns</STRONG> are initialized
       by <STRONG>setupterm</STRONG> as follows:

       <STRONG>o</STRONG>   If <STRONG>use_env(FALSE)</STRONG> has been called,  values  for  <STRONG>lines</STRONG>
           and <STRONG>columns</STRONG> specified in <STRONG>terminfo</STRONG> are used.

       <STRONG>o</STRONG>   Otherwise, if the environment variables <STRONG>LINES</STRONG> and <STRONG>COL-</STRONG>
           <STRONG>UMNS</STRONG> exist, their values are used.  If these  environ-
           ment variables do not exist and the program is running
           in a window, the current window size is used.   Other-
           wise,  if  the environment variables do not exist, the
           values for <STRONG>lines</STRONG> and <STRONG>columns</STRONG> specified in the <STRONG>terminfo</STRONG>
           database are used.

       Parameterized  strings  should  be passed through <STRONG>tparm</STRONG> to
       instantiate them.  All  <STRONG>terminfo</STRONG>  strings  [including  the
       output  of  <STRONG>tparm</STRONG>]  should  be printed with <STRONG>tputs</STRONG> or <STRONG>putp</STRONG>.
       Call <STRONG>reset_shell_mode</STRONG> to restore the tty modes before  ex-
       iting [see <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>].

       Programs which use cursor addressing should

       <STRONG>o</STRONG>   output <STRONG>enter_ca_mode</STRONG> upon startup and

       <STRONG>o</STRONG>   output <STRONG>exit_ca_mode</STRONG> before exiting.

       Programs which execute shell subprocesses should

       <STRONG>o</STRONG>   call  <STRONG>reset_shell_mode</STRONG>  and output <STRONG>exit_ca_mode</STRONG> before
           the shell is called and

       <STRONG>o</STRONG>   output <STRONG>enter_ca_mode</STRONG> and  call  <STRONG>reset_prog_mode</STRONG>  after
           returning from the shell.

       The <STRONG>setupterm</STRONG> routine reads in the <STRONG>terminfo</STRONG> database, ini-
       tializing the <STRONG>terminfo</STRONG> structures, but does not set up the
       output virtualization structures used by <STRONG>curses</STRONG>.  The ter-
       minal type is the character string <EM>term</EM>; if <EM>term</EM> is  null,
       the  environment  variable <STRONG>TERM</STRONG> is used.  All output is to
       file descriptor <STRONG>fildes</STRONG> which is  initialized  for  output.
       If  <EM>errret</EM>  is  not null, then <STRONG>setupterm</STRONG> returns <STRONG>OK</STRONG> or <STRONG>ERR</STRONG>
       and stores a status value in the integer pointed to by <EM>er-</EM>
       <EM>rret</EM>.   A  return value of <STRONG>OK</STRONG> combined with status of <STRONG>1</STRONG> in
       <EM>errret</EM> is normal.  If <STRONG>ERR</STRONG> is returned, examine <EM>errret</EM>:

       <STRONG>1</STRONG>    means that the terminal is hardcopy, cannot  be  used
            for curses applications.

            <STRONG>setupterm</STRONG>  determines if the entry is a hardcopy type
            by checking the <EM>hc</EM> (<EM>hardcopy</EM>) capability.

       <STRONG>0</STRONG>    means that the terminal could not be found,  or  that
            it  is  a generic type, having too little information
            for curses applications to run.

            <STRONG>setupterm</STRONG> determines if the entry is a  generic  type
            by checking the <EM>gn</EM> (<EM>generic</EM>) capability.

       <STRONG>-1</STRONG>   means that the <STRONG>terminfo</STRONG> database could not be found.

       If  <EM>errret</EM> is null, <STRONG>setupterm</STRONG> prints an error message upon
       finding an error and exits.  Thus, the simplest call is:

             <STRONG>setupterm((char</STRONG> <STRONG>*)0,</STRONG> <STRONG>1,</STRONG> <STRONG>(int</STRONG> <STRONG>*)0);</STRONG>,

       which uses all the defaults and sends the output  to  <STRONG>std-</STRONG>
       <STRONG>out</STRONG>.

       The <STRONG>setterm</STRONG> routine was replaced by <STRONG>setupterm</STRONG>.  The call:

             <STRONG>setupterm(</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>1,</STRONG> <STRONG>(int</STRONG> <STRONG>*)0)</STRONG>

       provides  the  same  functionality  as <STRONG>setterm(</STRONG><EM>term</EM><STRONG>)</STRONG>.  The
       <STRONG>setterm</STRONG> routine is provided for BSD compatibility, and  is
       not recommended for new programs.


</PRE>
<H3><a name="h3-The-Terminal-State">The Terminal State</a></H3><PRE>
       The  <STRONG>setupterm</STRONG>  routine  stores  its information about the
       terminal in a <STRONG>TERMINAL</STRONG> structure pointed to by the  global
       variable  <STRONG>cur_term</STRONG>.   If  it  detects an error, or decides
       that the terminal is unsuitable (hardcopy or generic),  it
       discards  this information, making it not available to ap-
       plications.

       If <STRONG>setupterm</STRONG> is called repeatedly for  the  same  terminal
       type,  it  will  reuse the information.  It maintains only
       one copy of a given terminal's capabilities in memory.  If
       it is called for different terminal types, <STRONG>setupterm</STRONG> allo-
       cates new storage for each set of terminal capabilities.

       The <STRONG>set_curterm</STRONG> routine sets <STRONG>cur_term</STRONG> to <EM>nterm</EM>, and  makes
       all of the <STRONG>terminfo</STRONG> boolean, numeric, and string variables
       use the values from <EM>nterm</EM>.  It returns the  old  value  of
       <STRONG>cur_term</STRONG>.

       The  <STRONG>del_curterm</STRONG>  routine  frees  the  space pointed to by
       <EM>oterm</EM> and makes it available for further use.  If <EM>oterm</EM> is
       the  same  as  <STRONG>cur_term</STRONG>, references to any of the <STRONG>terminfo</STRONG>
       boolean, numeric, and string variables thereafter may  re-
       fer  to  invalid  memory locations until another <STRONG>setupterm</STRONG>
       has been called.

       The  <STRONG>restartterm</STRONG>  routine  is  similar  to  <STRONG>setupterm</STRONG>  and
       <STRONG>initscr</STRONG>,  except  that it is called after restoring memory
       to a previous state (for example, when  reloading  a  game
       saved as a core image dump).  <STRONG>restartterm</STRONG> assumes that the
       windows and the input and output options are the  same  as
       when memory was saved, but the terminal type and baud rate
       may be different.  Accordingly, <STRONG>restartterm</STRONG> saves  various
       tty  state  bits,  calls  <STRONG>setupterm</STRONG>, and then restores the
       bits.


</PRE>
<H3><a name="h3-Formatting-Output">Formatting Output</a></H3><PRE>
       The <STRONG>tparm</STRONG> routine instantiates the string <EM>str</EM> with parame-
       ters  <EM>pi</EM>.  A pointer is returned to the result of <EM>str</EM> with
       the parameters applied.

       <STRONG>tiparm</STRONG> is a newer form  of  <STRONG>tparm</STRONG>  which  uses  <EM>&lt;stdarg.h&gt;</EM>
       rather  than  a fixed-parameter list.  Its numeric parame-
       ters are integers (int) rather than longs.


</PRE>
<H3><a name="h3-Output-Functions">Output Functions</a></H3><PRE>
       The <STRONG>tputs</STRONG>  routine  applies  padding  information  to  the
       string  <EM>str</EM>  and  outputs  it.  The <EM>str</EM> must be a terminfo
       string variable or the return value from  <STRONG>tparm</STRONG>,  <STRONG>tgetstr</STRONG>,
       or <STRONG>tgoto</STRONG>.  <EM>affcnt</EM> is the number of lines affected, or 1 if
       not applicable.  <EM>putc</EM> is a <STRONG>putchar</STRONG>-like routine  to  which
       the characters are passed, one at a time.

       The  <STRONG>putp</STRONG> routine calls <STRONG>tputs(</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>1,</STRONG> <STRONG>putchar)</STRONG>.  Note that
       the output of <STRONG>putp</STRONG> always  goes  to  <STRONG>stdout</STRONG>,  not  to  the
       <EM>fildes</EM> specified in <STRONG>setupterm</STRONG>.

       The <STRONG>vidputs</STRONG> routine displays the string on the terminal in
       the video attribute mode <EM>attrs</EM>, which is  any  combination
       of  the  attributes  listed in <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>.  The characters
       are passed to the <STRONG>putchar</STRONG>-like routine <EM>putc</EM>.

       The <STRONG>vidattr</STRONG> routine is like the  <STRONG>vidputs</STRONG>  routine,  except
       that it outputs through <STRONG>putchar</STRONG>.

       The  <STRONG>vid_attr</STRONG>  and <STRONG>vid_puts</STRONG> routines correspond to vidattr
       and vidputs, respectively.  They use a  set  of  arguments
       for  representing  the  video attributes plus color, i.e.,
       one of type attr_t for the attributes and one of short for
       the color_pair number.  The <STRONG>vid_attr</STRONG> and <STRONG>vid_puts</STRONG> routines
       are designed to use the attribute constants with  the  <EM>WA</EM><STRONG>_</STRONG>
       prefix.   The  opts  argument  is reserved for future use.
       Currently, applications must provide a  null  pointer  for
       that argument.

       The  <STRONG>mvcur</STRONG>  routine  provides low-level cursor motion.  It
       takes effect immediately (rather  than  at  the  next  re-
       fresh).


</PRE>
<H3><a name="h3-Terminal-Capability-Functions">Terminal Capability Functions</a></H3><PRE>
       The  <STRONG>tigetflag</STRONG>,  <STRONG>tigetnum</STRONG> and <STRONG>tigetstr</STRONG> routines return the
       value of the capability corresponding to the <STRONG>terminfo</STRONG> <EM>cap-</EM>
       <EM>name</EM>  passed  to them, such as <STRONG>xenl</STRONG>.  The <EM>capname</EM> for each
       capability is given in the table column  entitled  <EM>capname</EM>
       code in the capabilities section of <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.

       These routines return special values to denote errors.

       The <STRONG>tigetflag</STRONG> routine returns

       <STRONG>-1</STRONG>     if <EM>capname</EM> is not a boolean capability, or

       <STRONG>0</STRONG>      if  it  is canceled or absent from the terminal de-
              scription.

       The <STRONG>tigetnum</STRONG> routine returns

       <STRONG>-2</STRONG>     if <EM>capname</EM> is not a numeric capability, or

       <STRONG>-1</STRONG>     if it is canceled or absent from the  terminal  de-
              scription.

       The <STRONG>tigetstr</STRONG> routine returns

       <STRONG>(char</STRONG> <STRONG>*)-1</STRONG>
              if <EM>capname</EM> is not a string capability, or

       <STRONG>0</STRONG>      if  it  is canceled or absent from the terminal de-
              scription.


</PRE>
<H3><a name="h3-Terminal-Capability-Names">Terminal Capability Names</a></H3><PRE>
       These null-terminated arrays contain  the  short  terminfo
       names  ("codes"), the <STRONG>termcap</STRONG> names, and the long terminfo
       names ("fnames") for each of the predefined <STRONG>terminfo</STRONG> vari-
       ables:
              <STRONG>char</STRONG> <STRONG>*boolnames[]</STRONG>, <STRONG>*boolcodes[]</STRONG>, <STRONG>*boolfnames[]</STRONG>

              <STRONG>char</STRONG> <STRONG>*numnames[]</STRONG>, <STRONG>*numcodes[]</STRONG>, <STRONG>*numfnames[]</STRONG>

              <STRONG>char</STRONG> <STRONG>*strnames[]</STRONG>, <STRONG>*strcodes[]</STRONG>, <STRONG>*strfnames[]</STRONG>


</PRE>
<H2><a name="h2-RETURN-VALUE">RETURN VALUE</a></H2><PRE>
       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, unless otherwise noted
       in the preceding routine descriptions.

       Routines that return pointers always return <STRONG>NULL</STRONG> on error.

       X/Open defines no error conditions.  In  this  implementa-
       tion

            <STRONG>del_curterm</STRONG>
                 returns  an  error  if its terminal parameter is
                 null.

            <STRONG>putp</STRONG> calls <STRONG>tputs</STRONG>, returning the same error-codes.

            <STRONG>restartterm</STRONG>
                 returns an error if the associated call  to  <STRONG>se-</STRONG>
                 <STRONG>tupterm</STRONG> returns an error.

            <STRONG>setupterm</STRONG>
                 returns  an  error  if it cannot allocate enough
                 memory, or create the initial  windows  (stdscr,
                 curscr,  newscr).   Other  error  conditions are
                 documented above.

            <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  value  of
                 the output function <EM>putc</EM>.


</PRE>
<H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
       X/Open notes that <STRONG>vidattr</STRONG> and <STRONG>vidputs</STRONG> may be macros.

       The  function  <STRONG>setterm</STRONG> is not described by X/Open and must
       be considered non-portable.  All other  functions  are  as
       described by X/Open.

       <STRONG>setupterm</STRONG>  copies  the terminal name to the array <STRONG>ttytype</STRONG>.
       This is not part of X/Open Curses, but is assumed by  some
       applications.

       If  configured  to  use the terminal-driver, e.g., for the
       MinGW port,

       <STRONG>o</STRONG>   <STRONG>setupterm</STRONG> interprets a missing/empty TERM variable  as
           the special value "unknown".

       <STRONG>o</STRONG>   <STRONG>setupterm</STRONG>  allows explicit use of the the windows con-
           sole driver by checking if $TERM is set to "#win32con"
           or an abbreviation of that string.

       Older versions of <STRONG>ncurses</STRONG> assumed that the file descriptor
       passed to <STRONG>setupterm</STRONG> from <STRONG>initscr</STRONG> or <STRONG>newterm</STRONG> uses  buffered
       I/O,  and would write to the corresponding stream.  In ad-
       dition to the limitation that the  terminal  was  left  in
       block-buffered  mode on exit (like SystemV curses), it was
       problematic because <STRONG>ncurses</STRONG> did not allow a  reliable  way
       to cleanup on receiving SIGTSTP.  The current version uses
       output buffers managed directly by <STRONG>ncurses</STRONG>.  Some  of  the
       low-level functions described in this manual page write to
       the standard output.  They are not signal-safe.  The high-
       level functions in <STRONG>ncurses</STRONG> use alternate versions of these
       functions using the more reliable buffering scheme.

       In System V Release 4, <STRONG>set_curterm</STRONG> has an <STRONG>int</STRONG> return  type
       and  returns  <STRONG>OK</STRONG>  or <STRONG>ERR</STRONG>.  We have chosen to implement the
       X/Open Curses semantics.

       In System V Release 4, the third argument of <STRONG>tputs</STRONG> has the
       type <STRONG>int</STRONG> <STRONG>(*putc)(char)</STRONG>.

       At least one implementation of X/Open Curses (Solaris) re-
       turns a value other than OK/ERR from <STRONG>tputs</STRONG>.  That  returns
       the length of the string, and does no error-checking.

       X/Open  Curses prototypes <STRONG>tparm</STRONG> with a fixed number of pa-
       rameters, rather than a variable argument list.  This  im-
       plementation  uses  a  variable  argument list, but can be
       configured to use the fixed-parameter list.  Portable  ap-
       plications  should  provide 9 parameters after the format;
       zeroes are fine for this purpose.

       In response to comments by Thomas E. Dickey, X/Open Curses
       Issue 7 proposed the <STRONG>tiparm</STRONG> function in mid-2009.

       X/Open  notes  that  after calling <STRONG>mvcur</STRONG>, the curses state
       may not match the actual terminal state, and that  an  ap-
       plication  should  touch and refresh the window before re-
       suming normal curses calls.  Both <STRONG>ncurses</STRONG> and System V Re-
       lease 4 curses implement <STRONG>mvcur</STRONG> using the SCREEN data allo-
       cated in either <STRONG>initscr</STRONG> or <STRONG>newterm</STRONG>.  So though it is docu-
       mented  as  a  terminfo function, <STRONG>mvcur</STRONG> is really a curses
       function which is not well specified.

       X/Open states that the old  location  must  be  given  for
       <STRONG>mvcur</STRONG>.   This implementation allows the caller to use -1's
       for the old ordinates.  In that case, the old location  is
       unknown.

       Other  implementions  may  not declare the capability name
       arrays.  Some provide them without declaring them.  X/Open
       does not specify them.

       Extended  terminal  capability  names, e.g., as defined by
       <STRONG>tic</STRONG> <STRONG>-x</STRONG>, are not stored in the arrays described here.


</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_initscr.3x.html">curs_initscr(3x)</A></STRONG>, <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>,  <STRONG>curs_term-</STRONG>
       <STRONG><A HREF="curs_termcap.3x.html">cap(3x)</A></STRONG>,  <STRONG><A HREF="curs_variables.3x.html">curs_variables(3x)</A></STRONG>, <STRONG><A HREF="term_variables.3x.html">term_variables(3x)</A></STRONG>, <STRONG>putc(3)</STRONG>,
       <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>



                                                      <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
</PRE>
<div class="nav">
<ul>
<li><a href="#h2-NAME">NAME</a></li>
<li><a href="#h2-SYNOPSIS">SYNOPSIS</a></li>
<li><a href="#h2-DESCRIPTION">DESCRIPTION</a>
<ul>
<li><a href="#h3-Initialization">Initialization</a></li>
<li><a href="#h3-The-Terminal-State">The Terminal State</a></li>
<li><a href="#h3-Formatting-Output">Formatting Output</a></li>
<li><a href="#h3-Output-Functions">Output Functions</a></li>
<li><a href="#h3-Terminal-Capability-Functions">Terminal Capability Functions</a></li>
<li><a href="#h3-Terminal-Capability-Names">Terminal Capability Names</a></li>
</ul>
</li>
<li><a href="#h2-RETURN-VALUE">RETURN VALUE</a></li>
<li><a href="#h2-PORTABILITY">PORTABILITY</a></li>
<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
</ul>
</div>
</BODY>
</HTML>
