]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - doc/html/man/curs_terminfo.3x.html
ncurses 6.4 - patch 20230805
[ncurses.git] / doc / html / man / curs_terminfo.3x.html
index c50d7db335adb200641134c57006511622c7df21..c7485aeadd7762030dac9312be4775f1c41580d8 100644 (file)
@@ -1,6 +1,7 @@
 <!--
+  * 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,7 +28,7 @@
   * sale, use or other dealings in this Software without prior written       *
   * authorization.                                                           *
   ****************************************************************************
-  * @Id: curs_terminfo.3x,v 1.82 2022/06/04 22:47:05 tom Exp @
+  * @Id: curs_terminfo.3x,v 1.94 2023/08/06 00:03:04 tom Exp @
   * ***************************************************************************
   * ***************************************************************************
   * ***************************************************************************
 <HEAD>
 <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
 <meta name="generator" content="Manpage converted by man2html - see https://invisible-island.net/scripts/readme.html#others_scripts">
-<TITLE>curs_terminfo 3x</TITLE>
+<TITLE>curs_terminfo 3x 2023-08-05 ncurses 6.4 Library calls</TITLE>
 <link rel="author" href="mailto:bug-ncurses@gnu.org">
 
 </HEAD>
 <BODY>
-<H1 class="no-header">curs_terminfo 3x</H1>
+<H1 class="no-header">curs_terminfo 3x 2023-08-05 ncurses 6.4 Library calls</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>
+<STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>                Library calls               <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>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
+       <STRONG>tigetflag</STRONG>, <STRONG>tigetnum</STRONG>, <STRONG>tigetstr</STRONG>, <STRONG>tiparm</STRONG>, <STRONG>tiparm_s</STRONG>, <STRONG>tiscan_s</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>
@@ -83,6 +85,9 @@
        <STRONG>int</STRONG> <STRONG>restartterm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>term</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>filedes</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>errret</EM><STRONG>);</STRONG>
 
        <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+            <EM>or</EM>
+       <STRONG>char</STRONG> <STRONG>*tparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>long</STRONG> <EM>p1</EM> <EM>...</EM> <STRONG>long</STRONG> <EM>p9</EM><STRONG>);</STRONG>
+
        <STRONG>int</STRONG> <STRONG>tputs(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>affcnt</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>(*</STRONG><EM>putc</EM><STRONG>)(int));</STRONG>
        <STRONG>int</STRONG> <STRONG>putp(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>);</STRONG>
 
 
        <STRONG>char</STRONG> <STRONG>*tiparm(const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
 
+       /* extensions */
+       <STRONG>char</STRONG> <STRONG>*tiparm_s(int</STRONG> <EM>expected</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <EM>mask</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>...);</STRONG>
+       <STRONG>int</STRONG> <STRONG>tiscan_s(int</STRONG> <STRONG>*</STRONG><EM>expected</EM><STRONG>,</STRONG> <STRONG>int</STRONG> <STRONG>*</STRONG><EM>mask</EM><STRONG>,</STRONG> <STRONG>const</STRONG> <STRONG>char</STRONG> <STRONG>*</STRONG><EM>str</EM><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
+       These low-level routines must be called by programs that have  to  deal
        directly with the <STRONG>terminfo</STRONG> database to handle certain terminal capabil-
        ities, such as programming function keys.  For all other functionality,
        <STRONG>curses</STRONG> routines are more suitable and their use is recommended.
 
-       None of these functions use  (or  are  aware  of)  multibyte  character
+       None  of  these  functions  use  (or  are aware of) multibyte character
        strings such as UTF-8:
 
        <STRONG>o</STRONG>   capability names use the POSIX portable character set
 
-       <STRONG>o</STRONG>   capability  string  values  have  no  associated encoding; they are
+       <STRONG>o</STRONG>   capability string values have  no  associated  encoding;  they  are
            strings of 8-bit characters.
 
 
 </PRE><H3><a name="h3-Initialization">Initialization</a></H3><PRE>
        Initially, <STRONG>setupterm</STRONG> should be called.  The high-level curses functions
-       <STRONG>initscr</STRONG>  and  <STRONG>newterm</STRONG> call <STRONG>setupterm</STRONG> to initialize the low-level set of
+       <STRONG>initscr</STRONG> and <STRONG>newterm</STRONG> call <STRONG>setupterm</STRONG> to initialize the low-level  set  of
        terminal-dependent variables [listed in <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>].
 
-       Applications can use the terminal  capabilities  either  directly  (via
-       header  definitions),  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  defini-
+       Applications  can  use  the  terminal capabilities either directly (via
+       header definitions), 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 defini-
        tions for these strings, numbers, and flags.
 
-       The  <STRONG>terminfo</STRONG>  variables <STRONG>lines</STRONG> and <STRONG>columns</STRONG> are initialized by <STRONG>setupterm</STRONG>
+       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>
+       <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>COLUMNS</STRONG> exist,
+       <STRONG>o</STRONG>   Otherwise, if the environment variables <STRONG>LINES</STRONG>  and  <STRONG>COLUMNS</STRONG>  exist,
            their values are used.  If these environment variables do not exist
-           and  the program is running in a window, the current window size is
-           used.  Otherwise, if the environment variables do  not  exist,  the
+           and the program is running in a window, the current window size  is
+           used.   Otherwise,  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
+       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 exiting [see <STRONG><A HREF="curs_kernel.3x.html">curs_kernel(3x)</A></STRONG>].
 
        Programs which use cursor addressing should
 
        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
+       <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
+       <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, initializing the
-       <STRONG>terminfo</STRONG> structures, but does not  set  up  the  output  virtualization
+       The <STRONG>setupterm</STRONG> routine reads in the <STRONG>terminfo</STRONG> database, initializing  the
+       <STRONG>terminfo</STRONG>  structures,  but  does  not  set up the output virtualization
        structures used by <STRONG>curses</STRONG>.  These are its parameters:
 
           <EM>term</EM> is the terminal type, a character string.  If <EM>term</EM> is null, the
                environment variable <STRONG>TERM</STRONG> is used.
 
           <EM>filedes</EM>
-               is the file descriptor used for all output.
+               is  the  file  descriptor used for getting and setting terminal
+               I/O modes.
+
+               Higher-level applications use <STRONG><A HREF="curs_initscr.3x.html">newterm(3x)</A></STRONG> for initializing  the
+               terminal,  passing  an  output <EM>stream</EM> rather than a <EM>descriptor</EM>.
+               In curses, the two are  the  same  because  <STRONG>newterm</STRONG>  calls  <STRONG>se-</STRONG>
+               <STRONG>tupterm</STRONG>,  passing  the  file descriptor derived from its output
+               stream parameter.
 
           <EM>errret</EM>
                points to an optional location where an error status can be re-
                     applications to run.
 
                     <STRONG>setupterm</STRONG> determines if the entry is  a  generic  type  by
-                    checking the <STRONG>gn</STRONG> (<STRONG>generic</STRONG>) capability.
+                    checking the <STRONG>gn</STRONG> (<STRONG>generic_type</STRONG>) capability.
 
                <STRONG>-1</STRONG>   means that the <STRONG>terminfo</STRONG> database could not be found.
 
        fixed-parameter list.  Its numeric parameters are integers (int) rather
        than longs.
 
+       Both  <STRONG>tparm</STRONG>  and  <STRONG>tiparm</STRONG>  assume that the application passes parameters
+       consistent with the terminal description.  Two extensions are  provided
+       as alternatives to deal with untrusted data:
+
+       <STRONG>o</STRONG>   <STRONG>tiparm_s</STRONG>  is an extension which is a safer formatting function than
+           <STRONG>tparm</STRONG> or <STRONG>tiparm</STRONG>, 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.
+
+           The <EM>mask</EM> parameter has one bit set for each of the  parameters  (up
+           to 9) which will be passed as char* rather than numbers.
+
+       <STRONG>o</STRONG>   The  extension <STRONG>tiscan_s</STRONG> allows the application to inspect a format-
+           ting capability to see what the curses library would assume.
+
 
 </PRE><H3><a name="h3-Output-Functions">Output Functions</a></H3><PRE>
-       The  <STRONG>tputs</STRONG>  routine  applies padding information (i.e., by interpreting
-       marker embedded in the terminfo capability such as  "$&lt;5&gt;"  as  5  mil-
+       The <STRONG>tputs</STRONG> routine applies padding information  (i.e.,  by  interpreting
+       marker  embedded  in  the  terminfo capability such as "$&lt;5&gt;" as 5 mil-
        liseconds) to the string <EM>str</EM> and outputs it:
 
-       <STRONG>o</STRONG>   The  <EM>str</EM> parameter must be a terminfo string variable or the return
+       <STRONG>o</STRONG>   The <EM>str</EM> parameter must be a terminfo string variable or the  return
            value from <STRONG>tparm</STRONG>, <STRONG>tiparm</STRONG>, <STRONG>tgetstr</STRONG>, or <STRONG>tgoto</STRONG>.
 
-           The <STRONG>tgetstr</STRONG> and <STRONG>tgoto</STRONG> functions are part of the <EM>termcap</EM>  interface,
-           which  happens to share this function name with the <EM>terminfo</EM> inter-
+           The  <STRONG>tgetstr</STRONG> and <STRONG>tgoto</STRONG> functions are part of the <EM>termcap</EM> interface,
+           which happens to share this function name with the <EM>terminfo</EM>  inter-
            face.
 
        <STRONG>o</STRONG>   <EM>affcnt</EM> is the number of lines affected, or 1 if not applicable.
 
-       <STRONG>o</STRONG>   <EM>putc</EM> is a <STRONG>putchar</STRONG>-like routine to which the characters are  passed,
+       <STRONG>o</STRONG>   <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>.  The output of <STRONG>putp</STRONG> al-
+       The <STRONG>putp</STRONG> routine calls <STRONG>tputs(</STRONG><EM>str</EM><STRONG>,</STRONG> <STRONG>1,</STRONG> <STRONG>putchar)</STRONG>.  The output of <STRONG>putp</STRONG>  al-
        ways goes to <STRONG>stdout</STRONG>, rather than the <EM>filedes</EM> specified in <STRONG>setupterm</STRONG>.
 
-       The <STRONG>vidputs</STRONG> routine displays the string on the terminal  in  the  video
+       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
+       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
+       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.,
 
        <STRONG>o</STRONG>   <EM>attrs</EM> of type <STRONG>attr_t</STRONG> for the attributes and
 
        <STRONG>o</STRONG>   <EM>pair</EM> of type <STRONG>short</STRONG> for the color-pair number.
 
-       The <STRONG>vid_attr</STRONG> and <STRONG>vid_puts</STRONG> routines are designed to  use  the  attribute
+       The  <STRONG>vid_attr</STRONG>  and  <STRONG>vid_puts</STRONG> routines are designed to use the attribute
        constants with the <STRONG>WA_</STRONG> prefix.
 
-       X/Open  Curses  reserves  the <EM>opts</EM> argument for future use, saying that
-       applications must provide a null pointer for that argument.  As an  ex-
-       tension,  this  implementation  allows  <EM>opts</EM> to be used as a pointer to
+       X/Open Curses reserves the <EM>opts</EM> argument for future  use,  saying  that
+       applications  must provide a null pointer for that argument.  As an ex-
+       tension, this implementation allows <EM>opts</EM> to be used  as  a  pointer  to
        <STRONG>int</STRONG>, which overrides the <EM>pair</EM> (<STRONG>short</STRONG>) argument.
 
-       The <STRONG>mvcur</STRONG> routine provides low-level cursor motion.   It  takes  effect
-       immediately (rather than at the next refresh).
+       The  <STRONG>mvcur</STRONG>  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, <STRONG>mvcur</STRONG> uses an output file descriptor
+       derived from the output stream parameter of <STRONG><A HREF="curs_initscr.3x.html">newterm(3x)</A></STRONG>.
 
        While <STRONG>putp</STRONG> and <STRONG>mvcur</STRONG> are low-level functions which do not use the high-
        level curses state, they are declared in <STRONG>&lt;curses.h&gt;</STRONG> because SystemV did
        description.  As a side-effect, it sets <STRONG>cur_term</STRONG> to point to this memo-
        ry.  If an application calls
 
-            <STRONG>del_curterm(cur_term);</STRONG>
+               <STRONG>del_curterm(cur_term);</STRONG>
 
        the memory will be freed.
 
                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>
 
 
 </PRE><H2><a name="h2-PORTABILITY">PORTABILITY</a></H2><PRE>
 
+</PRE><H3><a name="h3-Extensions">Extensions</a></H3><PRE>
+       The  functions  marked as extensions were designed for <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>, and
+       are not found in SVr4 curses, 4.4BSD curses, or any other previous ver-
+       sion of curses.
+
+
 </PRE><H3><a name="h3-Legacy-functions">Legacy functions</a></H3><PRE>
        X/Open notes that <STRONG>vidattr</STRONG> and <STRONG>vidputs</STRONG> may be macros.
 
            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 standardized.
+           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.1.html">tput(1)</A></STRONG> program checks its use of these capabilities with a ta-
+           ble, 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>o</STRONG>   <STRONG>setupterm</STRONG> interprets a missing/empty TERM variable as  the  special
            value "unknown".
 
+           SVr4 curses uses the special value "dumb".
+
+           The  difference  between  the  two  is  that the former uses the <STRONG>gn</STRONG>
+           (<STRONG>generic_type</STRONG>) terminfo capability, while the latter does  not.   A
+           generic terminal is unsuitable for full-screen applications.
+
        <STRONG>o</STRONG>   <STRONG>setupterm</STRONG>  allows explicit use of the the windows console driver by
            checking if $TERM is set to "#win32con" or an abbreviation of  that
            string.
 
 
 
-                                                             <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
+ncurses 6.4                       2023-08-05                 <STRONG><A HREF="curs_terminfo.3x.html">curs_terminfo(3x)</A></STRONG>
 </PRE>
 <div class="nav">
 <ul>
 <li><a href="#h2-HISTORY">HISTORY</a></li>
 <li><a href="#h2-PORTABILITY">PORTABILITY</a>
 <ul>
+<li><a href="#h3-Extensions">Extensions</a></li>
 <li><a href="#h3-Legacy-functions">Legacy functions</a></li>
 <li><a href="#h3-Legacy-data">Legacy data</a></li>
 <li><a href="#h3-Output-buffering">Output buffering</a></li>